Redis怎么用LRU算法来清理过期数据,效果到底咋样呢?
- 问答
- 2026-01-12 14:23:22
- 1
我们需要明确一个关键点,这在你查阅的很多资料中可能没有一开始就讲清楚:Redis的LRU算法,主要不是用来直接清理那些已经设置了过期时间(TTL)的键的。 它的主要战场是当内存使用达到上限时,用来从所有键中(包括没有设置过期时间的永久键)挑选出哪些键应该被淘汰,从而腾出空间来存放新数据,而那些明确设置了过期时间的键,Redis有另外一套独立的、更高效的机制来处理。
你的问题其实包含了两个部分:一是Redis如何清理“过期”数据,二是LRU在内存淘汰中“挑选”数据的效果如何,我们来分开说。
第一部分:Redis如何真正“清理”过期数据?
Redis处理过期键的核心策略可以总结为“懒汉式”加上“定期扫除”,这就像你打扫房间一样。
-
惰性删除(懒汉式打扫):这是最基本的方式,当你尝试去访问一个键的时候,Redis才会顺便检查一下这个键是否已经过期了,如果过期了,那么就在返回结果给客户端之前,立刻把这个键删除掉,然后假装这个键从来不存在,这种方式的好处是特别省力气,只在必要的时候才干活,但坏处也很明显,如果一个过期的键永远没人去访问,那它就会一直像个幽灵一样占用着内存,直到天荒地老。
-
定期删除(定时扫除):为了解决“懒汉式打扫”的遗留问题,Redis会每隔一段时间(默认是每秒10次,可以配置)就主动抽出一丁点时间,从设置了过期时间的键中随机抽取一小部分(默认20个键),检查它们是否过期,如果过期的比例很高(比如超过25%),它就立刻再抽20个键继续检查,循环往复,直到过期的比例降下来,这样做的目的是为了在不影响主线程性能的前提下,悄悄地、持续地清理掉那些“僵尸”键。
对于已经过期的数据,Redis主要是通过“访问时检查”和“后台定时抽样”这两种方式来清理的,这个过程是自动的,你通常不需要干预。

第二部分:LRU算法在内存淘汰中“挑选”数据的效果咋样?
现在来到LRU的主场,当Redis的内存使用量达到了你在配置文件中设置的 maxmemory 上限时,再想写入新数据,就必须踢掉一些老数据才行,这时候,你就需要指定一个“淘汰策略”,而LRU就是其中一种经典的选择。
Redis使用的并不是传统的、精确的LRU算法,为什么?因为要实现一个完美的LRU,需要为每个键维护一个精确的访问时间戳链表,这个内存开销和计算开销对追求速度的Redis来说太大了,Redis采用了一种近似LRU算法。
近似LRU是怎么工作的呢? 它不再维护一个庞大的链表,而是采用了一种“抽样+淘汰最老样本”的巧妙方法,当需要淘汰键时,Redis会从整个键空间里随机抽取一定数量的键(这个数量可以配置,默认是5个),然后从这抽出来的几个键里面,淘汰掉那个最近最久未被使用的键,你可以把它想象成:不是从全校几万名学生中找出最早毕业的那个(精确LRU),而是随机走进几个班级,从这几个班里找出最早毕业的那个学生踢掉。

这种近似LRU的效果到底咋样呢?
根据Redis官方文档(来源:Redis官方文档关于LRU的说明)的解释和业界的普遍实践,其效果可以总结如下:
- 优点:内存开销极低,性能极高。 这是它最大的优势,它只用了很少的额外内存(每个键多存一个24位的时钟戳)就实现了接近真正LRU的效果,对Redis的高性能几乎没有影响。
- 效果足够好: 随着你增加抽样的样本数量(通过配置
maxmemory-samples参数,比如设为10),这个近似算法的准确度会非常接近真正的LRU,在绝大多数业务场景下,比如缓存系统,你并不需要100%的精确,只要能把那些“很明显”很久没用的热数据留在内存里,把“很明显”很冷的数据淘汰掉,这个算法的目的就达到了,实践证明,它的效果是完全可以接受的。 - 可调优: 如果你对缓存命中率有极致的要求,可以通过增大采样数量来提升准确性,当然这会稍微增加一点CPU的消耗,但这给了你一个权衡取舍的空间。
Redis清理数据是两套系统。过期键的清理,靠的是“访问时顺手删”和“后台定时抽样扫”,高效且自动,而LRU算法,是在内存满了要赶人走的时候,用来“挑人”的机制,它为了速度和节省内存,用的是“近似LRU”算法,通过随机抽样来找出大概最久没用的数据淘汰掉。
效果结论是:对于处理过期数据,Redis的机制很有效,对于在内存不足时使用LRU策略来淘汰数据,虽然它不是百分百精确,但因为它极高的性能和很小的内存损耗,以及可通过参数调优达到足够好的效果,使得它在实际生产中是一个非常优秀和实用的解决方案。 除非你的业务对缓存淘汰的精确性有极其苛刻的要求(这种场景非常罕见),否则Redis的近似LRU完全够用,甚至可以说是最佳实践。
本文由盘雅霜于2026-01-12发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/79358.html
