Redis 过期策略以及内存淘汰机制

Redis过期策略

一、定期删除

定期删除类似一个守护线程,每间隔一段时间就执行一次(默认100ms一次,可以通过修改配置文件redis.conf 的hz选项来调整这个次数),将过期的Key进行删除,具体过程如下:

 步骤1:从过期字典中随机选出20个key 
 步骤2:删除这20个key中已经过期的key 
 步骤3:如果过期的key的比例超过了1/4,那就重复从步骤1开始执行

之所以不一次性将所有过期的key都删除,是从性能角度做出的考量,当过期key特别多时,每次扫描全部的过期key,都会给CPU带来较大负担。既然无法一下子全部删除,那么我就进行多次(指每100ms执行一次,提高删除的频次)、部分的删除(只每次只抽取部分进行删除),以此来达到效果。

当然,这样随机的抽取过期key进行删除明显会遗漏很多过期key,这就要用到惰性删除

二、惰性删除

惰性删除即当查询某个Key时,判断该key是否已过期,如果已过期则从缓存中删除,同时返回空。

小结:
再回头看看过期策略,无论是定期删除还是惰性删除,都是一种不完全精确的删除策略,始终还是会存在已经过期的key无法被删除的场景。
而且这两种过期策略都是只针对设置了过期时间的key,不适用于没有设置过期时间的key的淘汰,所以,Redis还提供了内存淘汰策略,用来筛选淘汰指定的key。

Redis淘汰策略

一、不进行淘汰的策略noevition

此策略不会对缓存的数据进行淘汰,当内存不够了就会报错,因此,如果真实数据集大小大于缓存容量,就不要使用此策略

二、会进行淘汰的策略

1. volatile前缀

特点:针对设置了过期时间的key,在设置了过期时间的数据中筛选
volatile-random:随机删除
volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除
volatile-lru:使用 LRU 算法  进行筛选删除;least recently used,也就是最近最久使用算法,也就是淘汰使用时间最旧的数据
volatile-lfu:使用lfu算法进行淘汰;leastly frequently used,最近最少使用,也就是挑选出最近使用次数最少的key

2. allkeys前缀

 特点:对所有key一视同仁
 allkeys-random:随机删除allkeys-lru:使用 LRU 算法进行筛选删除
 allkeys-lfu:使用 LFU 算法进行筛选删除,也就是淘汰使用时间最旧的数据
 allkeys-lru:针对所有key使用lru算法进行淘汰,也就是淘汰最近使用次数最少的key

总结:Redis是通过 定期删除+惰性删除+配置的内存淘汰机制 来保证内存可用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值