别再死记八种策略了!Redis 淘汰机制其实超简单!

有时候,技术面试就像一场心理战。你以为面试官在聊 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-lruallkeys-lfu,前者基于最近最少使用,后者基于最少访问频率。

在生产中建议根据业务特点选择,并配合合理的 TTL 和监控策略使用。

这时候,你不只是答题,更像一个能落地、懂系统的工程师。相信我,这种答法,面试官都会点头!

END

Redis 的内存淘汰策略,其实很像我们自己的生活哲学。内存有限,选择就变得重要。要么珍惜常用的、要么舍弃无用的。

Redis 教会我们的,不只是技术,更是一种取舍的智慧。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
今日萌界称霸的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容