有时候,技术面试就像一场心理战。你以为面试官在聊 Redis 缓存?其实他在考你对“内存管理”的理解。今天,我就带你用一个小故事,轻松搞懂 Redis 的内存淘汰策略,让你在面试中胸有成竹、侃侃而谈!
那场面试,让我对“Redis 淘汰策略”彻底改观
上个月,我去参加一家金融科技公司的社招面试。面试官是个看起来不苟言笑的大哥,问的第一个问题就挺硬核:
“假设你的 Redis 已经满了,这时候又有新数据要写进去,会发生什么?”
我当时心里一咯噔:这不是考“内存淘汰策略”嘛!
但我也没慌,笑着回道:“Redis 会根据配置的策略,决定要不要淘汰旧数据。”
面试官微微一笑,继续追问:“那 Redis 一共有几种淘汰策略?各自适合什么场景?”
啊哈~果然来了。那场面试之后,我彻底总结了这道题的精髓。今天就把我的笔记、理解,还有一点点面试小心机,通通告诉你。
为什么 Redis 会需要“淘汰策略”?
Redis 是一个基于内存的数据库。它快,是因为所有数据都放在内存中。但问题来了:内存是有限的。
举个例子:
如果你用 Redis 做缓存,设置了 maxmemory=1GB,结果业务越来越大,一不小心就塞满了。
这时候 Redis 必须“做决定”——要不要删点旧的?删哪些?于是,“内存淘汰策略”登场了。它就像 Redis 的“清理规则”,告诉 Redis:
“当内存不够时,该优先清理哪些数据?”
Redis 的八种内存淘汰策略,一次讲透!
我们常说 Redis 有 8 种淘汰策略(老版本是 6 种,后来又多了两种)。它们的核心逻辑可以分成三大类:不淘汰、按过期时间淘汰、按访问特征淘汰。下面我们来讲故事。
1. noeviction(默认策略)
故事背景:
Redis 就像一个固执的仓库管理员。仓库爆满了,但他就是不想扔东西。你再塞新货进来?对不起,直接报错!
解释:
在 noeviction 模式下,Redis 不会删除任何数据。当内存不足时:
读操作没问题;但写操作(包括 set、incr 等)会直接返回错误。
适用场景:
数据不可丢的情况,比如金融账单、配置缓存等。不过这种策略一般只适合严格控制内存的系统,否则可能引发应用报错甚至崩溃。
2. volatile-lru(过期键 + LRU 算法)
故事背景:
Redis 像个聪明的仓管员,只在“设置了过期时间的货物”中挑选最久没被访问的扔掉。
解释:
LRU(Least Recently Used)是“最近最少使用”算法。意思是:谁最久没被碰过,谁先走。但 volatile-lru 有限制——只在“设置了过期时间”的键中生效。
适用场景:
一般用于缓存场景,尤其是只给部分数据设置了 TTL(过期时间)的系统。
3. volatile-ttl(过期键 + TTL 倒计时)
故事背景:
Redis 这次不看访问频率,只看“保质期”。哪个商品离过期时间最近,就优先清掉。
解释:
在设置了过期时间的键中,Redis 会优先删除快要到期的键。
适用场景:
适合对时效性敏感的业务,比如短视频的热度榜、秒杀库存等。
4. volatile-random(过期键 + 随机删除)
故事背景:
这位仓库管理员有点随性。他只在“有过期时间”的货物堆里随手挑几个扔。
解释:
当内存不够时,从带过期时间的键里随机挑选删除。简单粗暴,但不可预测。
适用场景:
不太推荐,除非测试环境或业务逻辑允许随机删除。
5. allkeys-lru(所有键 + LRU 算法)
故事背景:
Redis 这次下了狠心:无论有没有过期时间,只要最久没被访问的,都要淘汰。
解释:
这是最常用的策略之一!Redis 在所有键中,优先删除“最近最少使用”的数据。
适用场景:
适合绝大多数缓存业务,比如热点新闻、商品详情缓存、首页推荐等。因为这些数据随时都能重新加载。
6. allkeys-random(所有键 + 随机删除)
故事背景:
管理员又开始任性了,这次是所有货物中随机挑选一些扔掉。
解释:
所有键都有可能被删除,不管有没有过期时间。
适用场景:
小型系统或测试环境。但生产环境一般不建议,毕竟可能删掉热门数据。
7. volatile-lfu(过期键 + LFU 算法)
故事背景:
Redis 升级了仓管系统,装了一个统计器。它不看时间,只看访问频率——谁最不受欢迎,就删谁。
解释:
LFU(Least Frequently Used)算法:删除访问频率最低的键。但只作用于带过期时间的键。
适用场景:
适合流量分布极度不均的场景,比如热点商品缓存。
8. allkeys-lfu(所有键 + LFU 算法)
故事背景:
这是 Redis 4.0 之后的新宠。它既公平又高效,不分过期时间,直接根据访问频率决定淘汰。
解释:
访问频率低的数据优先被清除。比 LRU 更精确,因为它能避免“刚被访问一次”的误判。
适用场景:
推荐生产环境使用,尤其是大规模高并发缓存系统。比如:短视频推荐、社交热帖、搜索联想词等。
说了这么多,别急,我们来用一张表看清楚,Redis 八大淘汰策略,一目了然:

怎么配置 Redis 的淘汰策略?
在 Redis 配置文件 redis.conf 中,有一个关键参数:
maxmemory-policy allkeys-lru
这行配置就是决定 Redis 淘汰策略的关键。如果不配置,默认是 noeviction。另外还要注意设置:
maxmemory 512mb
否则 Redis 根本不会触发淘汰机制。
那面试官又问了:“你怎么选择合适的策略?”
这是面试中最容易被问“懵”的一环。我给你一个万能回答模板,稳得一批:
“具体要根据业务场景决定:
如果是纯缓存系统:推荐 allkeys-lru 或 allkeys-lfu;
如果部分数据设置了过期时间:用 volatile-lru;
如果数据不允许被删:noeviction;
如果需要控制时效:volatile-ttl;
其他策略(random)仅用于测试或特殊情况。”
面试官最爱听的补充点:
“Redis 4.0 之后推荐使用 LFU,它能更精确反映访问热度,避免 LRU 的时间偏差问题。”
这句话说完,分数就上去了!
深入理解:LRU vs LFU 的区别
很多人答题只记得名字,却讲不清两者差异。
LRU:关注“最近是否被访问”LFU:关注“被访问的次数”
举个例子:

在 LRU 规则下,会删掉 A(因为最近没被访问)。但在 LFU 规则下,会删掉 B(因为访问次数太少)。
面试官考点就在这里:
你是否理解算法背后的逻辑——Redis 是在平衡“时间”和“热度”的取舍。
再补一句:Redis 淘汰策略 ≠ 过期删除
有些同学容易混淆“过期删除机制”和“淘汰策略”,我一定要强调:
过期删除机制:针对设置了 TTL 的键,分为惰性删除 + 定期删除;内存淘汰策略:针对整体内存满的场景,Redis 主动删键。
两者虽然都在“删除”,但触发条件完全不同。这是面试中加分的隐藏点!
面试官最后笑了:“那你说说,你的 Redis 怎么调优?”
我说:
“我一般会先设置合理的 maxmemory,再选择 allkeys-lfu 策略,同时配合监控内存使用率。热点数据通过 TTL 控制,冷数据交给 Redis 自动淘汰。”
面试官点了点头,笑道:
“不错,看来 Redis 不只是‘记忆’,还是一门‘哲学’。”
我也笑了。确实,Redis 的淘汰策略,本质上是如何在有限资源里,做最聪明的取舍。
最后总结:面试时这样答最稳!
面试时,可以这样组织回答结构:
Redis 提供 8 种内存淘汰策略,分三类:
不淘汰: noeviction(默认);
只淘汰过期键: volatile-lru、volatile-ttl、volatile-random、volatile-lfu;
淘汰所有键: allkeys-lru、allkeys-random、allkeys-lfu。
其中最常用的是 allkeys-lru 和 allkeys-lfu,前者基于最近最少使用,后者基于最少访问频率。
在生产中建议根据业务特点选择,并配合合理的 TTL 和监控策略使用。
这时候,你不只是答题,更像一个能落地、懂系统的工程师。相信我,这种答法,面试官都会点头!
END
Redis 的内存淘汰策略,其实很像我们自己的生活哲学。内存有限,选择就变得重要。要么珍惜常用的、要么舍弃无用的。
Redis 教会我们的,不只是技术,更是一种取舍的智慧。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!















暂无评论内容