Redis 中数据库键的过期时间都保存在过期字典中,当一个键过期了,Redis 存在三种不同的删除策略:定时删除、惰性删除和定期删除
在设置键的过期时间的同时创建一个计时器,让定时器在键过期时间来临时,立即执行对键的删除操作。
定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽快被删除,并且释放过期键所占用的内存。
但是另一方面,它对 CPU 时间是嘴不友好的:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分的 CPU 时间,在内存不紧张但是 CPU 时间紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。
放任过期键不管,但是每次从键空间中获取键时都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期则返回该键。
惰性删除策略对 CPU 时间来说是最友好的,但是它对内存是最不友好的:如果一个键已经过期,而这个键又恰好没有被访问到的话,那么它可能永远都不回被删除,甚至可以将这种情况视为一种内存泄漏 —— 无用的垃圾数据占用了大量的内存,而服务器却不能主动去释放它们,这对于运行状态非常依赖于内存的 Redis 服务器来说,并不是一个好消息。
每隔一段时间,程序都会对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
从上面对定时删除和惰性删除的讨论来看,这两种删除方式在单一使用时都有非常明显的缺陷,定期删除策略可以看作是两种策略的一种整合和折中:
但是定期删除策略的难点是确定删除操作执行的时长和频率: