Redis如何删除设置了过期时间的key?
问:如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢?
如果回答是,那么面试官就会问你:🤔自己走还是我送你?
其实Redis对于过期key共有三种不同的删除策略:定时删除,惰性删除,定期删除;
1.定时删除
定时删除可以保证内存中数据的最大新鲜度,因为它会将过期的键值立马删掉,其所占用的内存也随即释放,但这样恰恰对于CPU而言是不友好的,原因是删除操作会占用CPU的时间,如果刚好碰上CPU繁忙的时候,就会给CPU造成额外的负担,从而产生大量的性能消耗,也会影响数据的读取操作。一句话讲就是用CPU性能换取存储空间。
2.惰性删除
惰性删除策略不同于定时删除,当数据到达过期时间的时候它不会作出处理,等到下一次访问的时候发现该数据已经过期,再去删除,并返回不存在。可以看出,这种策略对于内存是不友好的,而Redis恰恰是依赖于内存的,因此对于Redis来说肯定不是件好事。一句话讲就是用存储空间换取CPU性能。
3.定期删除
定期删除策略相当于是以上两种删除策略的折中,定期删除策略会每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。其做法为:周期性轮询 redis 库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
3.1定期删除策略的特点
- CPU性能占用有峰值,检测额度可以自行设置
- 内存压力不是很多,长期占用内存的冷数据会被持续清理
总结:周期性随机抽查存储空间
3.2定期删除的举例
redis 默认每间隔 100ms 检查是否有过期的 key,如果有过期 key 则删除。注意:redis 不是每隔100ms 将所有的 key 检查一次而是随机抽取进行检查(如果每隔 100ms,对全部 key 进行检查,那么redis 直接ICU)。因此,如果只采用定期删除策略,会导致很多 key 到时间没有删除。
3.3定期删除的难点
定期删除策略的难点是确定删除操作执行的时长和频率:redis 不可能时时刻刻遍历所有被设置了过期时间的 key,来检测数据是否已经到达过期时间,然后对它进行删除。
如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将 CPU 时间过多地消耗在删除过期键上面。
如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除束略一样,出现浪费内存的情况。
因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。