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

82 阅读8分钟

有时候,技术面试就像一场心理战。你以为面试官在聊 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 等)会直接返回错误。

适用场景:

  • 数据不可丢的情况,比如金融账单、配置缓存等。
  • 不过这种策略一般只适合严格控制内存的系统,否则可能引发应用报错甚至崩溃。
  1. volatile-lru(过期键 + LRU 算法)

故事背景:

  • Redis 像个聪明的仓管员,只在“设置了过期时间的货物”中挑选最久没被访问的扔掉。

解释:

  • LRU(Least Recently Used)是“最近最少使用”算法。
  • 意思是:谁最久没被碰过,谁先走。
  • 但 volatile-lru 有限制——只在“设置了过期时间”的键中生效。

适用场景:

  • 一般用于缓存场景,尤其是只给部分数据设置了 TTL(过期时间)的系统。
  1. volatile-ttl(过期键 + TTL 倒计时)

故事背景:

  • Redis 这次不看访问频率,只看“保质期”。
  • 哪个商品离过期时间最近,就优先清掉。

解释:

  • 在设置了过期时间的键中,Redis 会优先删除快要到期的键。

适用场景:

  • 适合对时效性敏感的业务,比如短视频的热度榜、秒杀库存等。
  1. volatile-random(过期键 + 随机删除)

故事背景:

  • 这位仓库管理员有点随性。
  • 他只在“有过期时间”的货物堆里随手挑几个扔。

解释:

  • 当内存不够时,从带过期时间的键里随机挑选删除。
  • 简单粗暴,但不可预测。

适用场景:

  • 不太推荐,除非测试环境或业务逻辑允许随机删除。
  1. allkeys-lru(所有键 + LRU 算法)

故事背景:

  • Redis 这次下了狠心:无论有没有过期时间,只要最久没被访问的,都要淘汰。

解释:

  • 这是最常用的策略之一!
  • Redis 在所有键中,优先删除“最近最少使用”的数据。

适用场景:

  • 适合绝大多数缓存业务,比如热点新闻、商品详情缓存、首页推荐等。
  • 因为这些数据随时都能重新加载。
  1. allkeys-random(所有键 + 随机删除)

故事背景:

  • 管理员又开始任性了,这次是所有货物中随机挑选一些扔掉。

解释:

  • 所有键都有可能被删除,不管有没有过期时间。

适用场景:

  • 小型系统或测试环境。
  • 但生产环境一般不建议,毕竟可能删掉热门数据。
  1. volatile-lfu(过期键 + LFU 算法)

故事背景:

  • Redis 升级了仓管系统,装了一个统计器。
  • 它不看时间,只看访问频率——谁最不受欢迎,就删谁。

解释:

  • LFU(Least Frequently Used)算法:删除访问频率最低的键。
  • 但只作用于带过期时间的键。

适用场景:

  • 适合流量分布极度不均的场景,比如热点商品缓存。
  1. 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!