暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis过期策略和淘汰策略

疯狂造轮子 2020-03-01
435


过期策略

什么是过期策略,过期策略不合适会产生什么后果

我们知道redis是一个可以为key设置过期时间的缓存数据库,当这些key过期后把当前过期对象从redis清除的行为就是过期策略;

试想redis里面存储大量设置了过期时间的数据时,如果在相同时间过期,redis会不会因为清理庞大的过期数据而无法响应正常的业务请求呢,因为redis是单线程的,如果在清理过期数据上消耗过多时间势必导致线上读写指令出现卡顿


Redis的过期策略采用的那种?

redis过期采用的是定时扫描+懒惰过期;
redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。


定时扫描是怎么个流程?

  1. 从过期字典中随机选出20个key;

  2. 删除20个key中已经过期的key;

  3. 如果这个20个key当中的过期key占比超过四分之一,重复步骤1;

Redis 会持续扫描过期字典 (循环多次),直到过期字典中过期的 key 变得稀疏,才会停止 (循环次数明显下降)
为了防止定时扫描过程中过期key太多而导致的循环过度,这里还增加了时间限制,也就是整个过程不能超过25ms


从库的过期策略和主库一样?

从库不会进行定式扫描,也不会懒惰删除,它是被动的,他只会同步主库的AOF的对数据库的操作命令,也就是说当主库AOF增加del指令时候会同步到所有从库,因为同步过程是异步进行的,可能会存在一定的延迟,出现主从数据不一致的现象。


Redis的淘汰策略

淘汰策略有哪些?

noevication:拒绝写服务,读服务正常

volatile-lru:在过期key集合中,最近最少使用的key优先被淘汰

volatile-ttl:早过期key集合中,剩余寿命最短的key优先被淘汰 

volatile-random:过期key集合中随机淘汰一部分key

allkeys-lru:在全部key集合中,最近最少使用的key优先被淘汰

allkeys-random:全部key集合中随机淘汰一部分key


什么是LRU算法

LRU算法由字典和链表组成;
链表记录元素被访问的顺序,当字典中元素被访问时,该元素就会被移动到链表表头;当存储达到限制时候,优先从链表尾部开始淘汰(也就是最近最少使用的数据);


Redis采用的是近似LRU算法

真正的LRU算法需要链表数据结构耗费太多的内存,所以redis的LRU算法不是真正的Lru算法但是也能近似达到LRU算法的效果;

redis会在每个对象增加一个额外的记录操作时间的时间戳,用来记录元素的访问顺序,

redis会随机采样一定数量的key,如果是allkeys就是从所有key字典中随机,这里需要看maxmemory-policy配置的淘汰策略

每次采样多少个 key 看的是 maxmemory_samples 的配置,默认为 5。

文章转载自疯狂造轮子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论