Redis过期删除策略和内存淘汰机制

首先要区分过期删除策略和内存淘汰策略  ,过期策略是key过期了,内存淘汰是内存不够用了,redis服务器把一些不常用的key清理出去,这些key并没有过期,一个是时间上一个是空间上

1.Redis 过期删除策略

使用 定时删除 + 懒惰删除 删除过期的 Key

(1)定时删除:对key-value设置一个过期时间,过期时间到达立即删除这个键值对

由于删除需要占用cpu,所以会影响速度,所以这就是用时间换空间

(2)懒惰删除:键值对到达过期时间,不删除,不做任何处理

等到下次访问该数据时,如果没有过期就返回数据,过期了就删除,返回不存在

也就是说懒惰删除是要用的时候才检查这个键值对是否过期

这就会发现内存里会存很多的数据,但不需要cpu去定期清理,所以速度很快,拿空间换时间

(3)定期删除:将所有设置了过期时间的key放入一个字典中  ,然后每隔一段时间(默认频率是每秒扫描10次,可以修改)从这个字典中随机挑选一些(比如20个)key进行检测,删除其中过期的key,如果这批key中有超过25%的比例过期,就会继续抽取20个随机key进行检测和删除,直到一批随机key中过期key少于25%

Redis是采用定期删除+懒惰删除的策略,就是说采用定期删除的策略,如果没有到隔离时间进行检查删除的时候,如果访问redis,检查到这个key是过期的,也会将这个key给删除了

既会进行定期删除,平时访问到这个key是过期的也会将这个key删除

2.Redis内存淘汰机制

LRU算法:Least Recently Used,即最近最少使用,将最近最不常用的数据选出来,保留那些最近频繁使用的数据,LRU 会把所有数据组成一个链表,链表头部称为 MRU,代表最近最常使用的数据;尾部称为 LRU代表最近最不常使用的数据( 即队头是常用数据,队尾是不常用数据)

举个例子,链表长度固定为4:

现在我们访问了3,于是将3这个节点拿到队头,谁被使用,就将这个结点放到链表头

现在又访问了2这个节点,将它拿到队头:

 最后写入5,由于链表长度固定为4,所以需要移除一个节点,把队尾最不常用的4移除掉

由于如果真的用链表管理所有缓存的数据,这会给 Redis 带来额外的巨大开销,而且,当有数据访问时就会有链表移动操作,会大大降低 Redis 的性能。于是,Redis 对 LRU 的实现进行了一些改变(称之为近似的LRU算法

记录每个 key 最近一次被访问的时间戳(用一个lru字段来记录),维护一个固定容量的集合

(1)先随机选择 N 个数据作为一个候选集合

(2)继续挑选数据进入集合,进入集合的条件是:它的 lru 大于候选集合中最小的 lru,到达最大容量之后,将 lru 值小的数据淘汰出去。(lru值越小,说明最近一次被访问的越早)

LFU算法

Least Frequently Used,即最不经常使用策略,它是基于数据访问次数来淘汰数据的(LRU是基于最后一次访问的时间来淘汰数据的)

为每个数据增加了一个计数器,来统计这个数据的访问次数。

把访问次数最低的数据淘汰,如果访问次数相同,再根据访问的时间,将访问时间戳最小的淘汰。

Redis4.0版本之前有6种策略,4.0增加了2种(主要增加了LFU算法,allkeys-lfu和volatile-lfu

8种淘汰策略:

(1)noevition,也就是不淘汰,不会对缓存的数据进行淘汰,当内存不够了就会报错

下面三种以allkeys开头的策略是针对所有数据的:一旦数据被选中了,即使过期时间没到,也会被删除,如果过期时间到了,但是没有被策略选中,同样会被删除

(2)allkeys-random:随机删除

(3)allkeys-lru:使用 LRU 算法进行筛选删除

(4)allkeys-lfu:使用 LFU 算法进行筛选删除

针对设置了过期时间的数据,即使缓存没有被写满,数据过期也会被删除

(5)volatile-random:随机删除

(6)volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除

(7)volatile-lru:使用 LRU 算法进行筛选删除

(8)volatile-lfu:使用 LFU 算法进行筛选删除

第四种allkeys-lfu和第八种volatile-lfu淘汰策略是redis4.0版本后新增的两种淘汰策略

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值