Redis基础

1.定义

      Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis在架构上具有如下特点:

      1.纯内存操作

       2.单线程操作,避免频繁的上下文切换。

       3.采用了非阻塞I/O多路复用机制。

      其线程模型大致如下所示:

      

     

     我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
     需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库,大家可以自行去了解。

2.为什么引入Redis

     引入多线程主要有2个原因,1是读取在redis中的数据是基于内存读取的,速度比较快,2.降低数据库的压力,但是这样也有双面性,数据存放在redis中也会引发一些相应的问题,主要是如下4个:

    (一)缓存和数据库双写一致性问题

            

         分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。

 
          首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

    (二)缓存雪崩问题

          即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

          解决方案:

          1.利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

           2.采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

           3.提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。

    (三)缓存击穿问题

           即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常

           解决方案:       

           1.给缓存的失效时间,加上一个随机值,避免集体失效。
           2.使用互斥锁,但是该方案吞吐量明显下降了。
           3.双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点:

                I 从缓存A读数据库,有则直接返回

                II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。

               III 更新线程同时更新缓存A和缓存B。

   (四)缓存的并发竞争问题

            这个问题大致就是,同时有多个子系统去set一个key。虽然redis本身有事务机制,但是在集群环境下redis事务会失效。

            解决办法:

               1.在没有顺序要求的情况下引入分布式锁,大家都去抢锁

               2.有顺序要求的情况下就在引入分布式锁的同时再加入时间戳。

3.Redis的过期算法和内存淘汰机制

   过期算法:

    1.定时删除

           定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key。这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。实际上redis是每隔100ms随机抽取一些key来检查和删除的。

    2.惰性删除

            在客户端获取某个key的时候,redis会检查一下,这个key如果设置了过期时间,且已经过期就会删除。虽然不用小号cpu去定时监控数据,但是会占用大量的内存。

     内存淘汰策略:

       1.淘汰即将过期最少使用的数据

       2.淘汰即将过期的最快过期的数据.

       3.随机淘汰即将过期的数据

       4.淘汰最少使用 的数据

       5.随机淘汰数据

       6.不淘汰数据,内存不够就报错

       在配置文件中的配置名:maxmemory-policy,可配属性:

      

属性名说明推荐
noeviction内存不足就直接报错,不淘汰数据不推荐
allkeys-lru移除最少使用的推荐
allkeys-random随机删除 
volatile-lru即将过期中最少使用的这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
volatile-random随机移除即将过期的不推荐
volatile-ttl移除最快过期的不推荐

 

内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值