(十四)redis过期策略

1)过期删除

大家都知道可以对redis的的key设置过期时间,一到时间key就失效。但是redis是怎么对失效的key进行删除的?
 
答案是:定期删除+惰性删除
 

定期删除

redis默认会每秒进行是过期扫描。过期扫描不是遍历过期字典里面所有的key,而是采用一种简单的贪心策略。
  1. 从过期的字典中随机20个key
  2. 删除20个key中已经过期的
  3. 如果过期的key比例超过四分之一,就重复步骤一
为了保证扫描不会循环过度,还增加了扫描的时间上限25毫秒。
但是定期删除可能会导致很多过期key到了时间并没有被删除掉,就需要惰性删除兜底了。
 

惰性删除

在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。、
 
 
从库的过期策略:从库对过期的处理是被动的,当主库key到期时会在AOF文件里面加一条del指令,同步到所有的从库中去,从库通过这个指令进行过期删除
因为主库过期的key的del指令是 异步进行的,会存在主从数据不一致问题。分布式锁的漏洞就是因为这个问题导致的
 

总结

问题:如果定期删除+惰性删除还是漏掉了许多key,导致内存耗尽怎么办
答案:走内存淘汰机制。
 

2)内存淘汰

如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:
  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了
  2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊
  4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值