(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,导致内存耗尽怎么办

答案:走内存淘汰机制。

 

(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优先移除