一个redis中可能同时存在很多很多key,这些可以中可能有很大一部分都有过期时间。此时,redis服务器咋知道哪些key已经过期要被删除,哪些key还没有过期?
为什么要这么问?因为如果直接遍历所有的key,显然是行不通的,效率非常低。
所以redis的整体策略是:1.惰性删除,2.定期删除。
1.惰性删除
假设这个key已经到了过期时间了,但是暂时还没删除它,key还存在,紧接着,后面有一次访问,正好用到这个key,于是这次访问就会让redis服务器触发删除key的操作,同时返回一个nil。(插一嘴,因为我比较喜欢把相似的东西放在一起思考,比如优先队列的更新里面的一个值就是使用的这个方法,将旧的值先放着,插入新的值,当访问到这个值的时候再将其删除。)
2.定期删除
每次抽取一部分,进行验证过期时间,保证这个抽取检查的过程要足够快!
为啥这里对于定期删除有明确的要求呢?因为这个redis是单线程程序。(如果扫描过期的key消耗太多的时间,就有可能导致正常的处理请求命令被堵塞,就和执行keys *命令一样不好的效果)