一个 redis 中可能同时存在很多很多 key,这些 key 中可能有很大一部分有过期时间,此时, redis 服务器咋知道哪些 key 已经过期要被删除,哪些 key 还没过期
如果直接遍历所有的 key,显然是行不通的,效率通常低redis 的整体策略是(两者结合)
- 定期删除
- 惰性删除
定期删除
每次抽取一部分,进行验证过期时间
保证这个抽取检查的过程,足够快!!!
惰性删除
假设这个 key 已经到过期时间了,但是暂时还没删它,key还存在
紧接着,后面又一次访问,正好用到了这个 key,于是这次访问就会让 redis 服务器触发删除 key 的操作,同时再返回一个 nil(nil 就是 null 的意思)
为什么对于定期删除的时间,有明确的要求呢?(要保证每次抽查的过程足够快)
因为 redis 是单线程的程序,如果扫描过期 key 消耗的时间太多了,就可能导致正常请求命令就被堵塞了(产生了类似于执行 keys * 这样的效果)
虽然有了上述两种策略结合,整体的效果一般,仍然可能会有很多过期的 key 被残留了,没有及时删除掉
redis 为了对上述进行补充,还提供了一系列的内存淘汰策略