(1)过期删除
大家都知道可以对redis的的key设置过期时间,一到时间key就失效。但是redis是怎么对失效的key进行删除的?
答案是:定期删除+惰性删除
定期删除
redis默认会每秒进行是过期扫描。过期扫描不是遍历过期字典里面所有的key,而是采用一种简单的贪心策略。
- 从过期的字典中随机20个key
- 删除20个key中已经过期的
- 如果过期的key比例超过四分之一,就重复步骤一
为了保证扫描不会循环过度,还增加了扫描的时间上限25毫秒。
但是定期删除可能会导致很多过期key到了时间并没有被删除掉,就需要惰性删除兜底了。
惰性删除
在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。、
从库的过期策略:从库对过期的处理是被动的,当主库key到期时会在AOF文件里面加一条del指令,同步到所有的从库中去,从库通过这个指令进行过期删除
异步进行的,会存在主从数据不一致问题。分布式锁的漏洞就是因为这个问题导致的
总结
问题:如果定期删除+惰性删除还是漏掉了许多key,导致内存耗尽怎么办
答案:走内存淘汰机制。
(2)内存淘汰
如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除