← 返回题目列表

Redis 的内存淘汰策略有哪些?LRU 和 LFU 有什么区别?

高频 中等 第 12 / 26 题 更新于 2026/07/28
Redis淘汰策略LRULFU

简化版

Redis 内存达到 maxmemory 后,会按配置的淘汰策略删除部分 key。常见策略有 noeviction、volatile-lru、allkeys-lru、volatile-ttl、volatile-random、allkeys-random、volatile-lfu、allkeys-lfu。LRU 淘汰最近最少使用的 key,看“最近有没有访问”;LFU 淘汰访问频率低的 key,看“访问次数多不多”。

详细版

Redis 淘汰策略分两类:只淘汰设置了过期时间的 key(volatile),或在所有 key 中淘汰(allkeys)。

策略含义适合场景
noeviction不淘汰,写入报错数据不能丢
allkeys-lru所有 key 中淘汰近似 LRU通用缓存
volatile-lru只在设置 TTL 的 key 中淘汰 LRU混合缓存与重要数据
allkeys-lfu所有 key 中淘汰低频 key热点稳定场景
volatile-lfuTTL key 中淘汰低频 key有过期时间的热点缓存
volatile-ttl淘汰最早过期 key希望优先清短 TTL
random随机淘汰要求不高,成本低

如果 Redis 只是缓存,常用 allkeys-lruallkeys-lfu。如果 Redis 里混有不能随便淘汰的数据,要谨慎使用 allkeys 类策略,最好从架构上隔离不同用途。

完整版教学

一、为什么需要淘汰策略

Redis 是内存数据库,内存有限。设置 maxmemory 后,当写入新数据导致内存超限,Redis 必须决定是拒绝写入,还是删掉一些旧 key 给新 key 腾空间。这个决策就是淘汰策略。

缓存系统通常允许丢弃部分 key,因为丢了还能从数据库重建;但如果 Redis 存的是会话、队列、锁、计数等关键数据,随便淘汰就可能造成业务错误。所以策略选择首先要看 Redis 在系统里的角色。

二、volatile 和 allkeys 的区别

volatile 类策略只从设置了过期时间的 key 中选择淘汰对象。没有 TTL 的 key 不会被淘汰。allkeys 类策略会从所有 key 中选择,无论有没有 TTL。

如果 Redis 专门做缓存,所有数据都可重建,allkeys 更直接。如果 Redis 里混放了缓存和不能丢的数据,volatile 看起来更安全,但更好的做法是拆实例或拆库,避免不同可靠性要求的数据混在一起。

三、LRU 和 LFU 怎么选

LRU 关注最近访问时间。一个 key 最近没被访问,就容易被淘汰。它适合访问热点变化较快的场景,比如新闻、活动页、搜索结果。

LFU 关注访问频率。一个 key 长期被访问很多次,即使短时间没访问,也不容易被淘汰。它适合热点比较稳定的场景,比如基础配置、热门商品、长期热门内容。

Redis 的 LRU/LFU 都是近似实现,不是严格全局排序,因为严格排序成本太高。Redis 会采样一批 key,从中挑最合适的淘汰。

四、noeviction 的含义

noeviction 不会删除 key,内存满后写命令报错,读命令还能继续。这适合不允许自动丢数据的场景,但如果业务没有处理写失败,可能直接引发线上错误。

作为纯缓存时,noeviction 往往不是好选择,因为内存满后新热点写不进去,缓存命中率会恶化。纯缓存更常用 allkeys-lru 或 allkeys-lfu。

五、淘汰策略之外还要做什么

淘汰策略只是最后防线。更重要的是容量规划、key 大小控制、TTL 设计、热点监控。大 key 会让内存快速膨胀,过长 TTL 会让冷数据长期占内存,缺少监控会让你直到写入报错才发现内存满了。

生产上要监控 used_memory、evicted_keys、hit_rate、big key、slowlog。如果 evicted_keys 持续增长且命中率下降,说明内存不足或缓存设计有问题。

六、面试追问与工程边界

面试官常会追问“内存满了只调淘汰策略够不够”。不够。淘汰策略只能在内存不足时被动删 key,真正的问题可能是 key 设计不合理、TTL 太长、大 key 太多或缓存了不该缓存的数据。要结合容量评估和数据治理一起做。

还要注意业务语义。被淘汰的 key 应该是可重建的缓存数据。如果 Redis 里放了分布式锁、消息状态、会话等关键数据,被 allkeys 策略淘汰可能造成严重业务问题。不同可靠性的数据最好拆实例,不要指望一个淘汰策略兼顾所有场景。

七、常见误区与追问

这道题不能只背概念,要把「缓存淘汰策略」放回真实分布式系统里解释:参与方是谁、状态怎么流转、失败后怎么恢复,以及它在一致性、性能、可用性之间做了什么取舍。

回答层次要讲清的内容容易漏掉的边界
核心结论淘汰策略决定内存不足时删除哪些 key,常见 LRU、LFU、TTL、Random 和 noeviction不要停在名词解释
流程机制设置 maxmemory -> 写入触发内存检查 -> 按策略选择候选 key -> 淘汰释放内存 -> 继续处理写入说明触发方、存储方、确认点和兜底
工程取舍Redis maxmemory 达到上限时,allkeys-lru 会从所有 key 中近似淘汰最近最少使用的数据缓存提升吞吐但会引入旧值、热点、内存和失效风暴问题
缓存淘汰策略 面试拆解:
1. 设置 maxmemory
2. 写入触发内存检查
3. 按策略选择候选 key
4. 淘汰释放内存
5. 继续处理写入

记忆钩子:先说明缓存承担的读写压力,再拆穿透、击穿、雪崩、热点、一致性和淘汰策略;回答时要紧扣「缓存淘汰策略」这道题,不要把相邻概念混成一段泛泛的分布式套话。

  • 误区:LRU 总能淘汰最不重要数据。 Redis LRU 是近似采样,且最近使用不等于业务价值最低。
  • 误区:noeviction 最安全。 内存满后写请求会失败,业务要能处理错误。
  • 误区:淘汰策略可以替代 TTL 设计。 TTL 体现业务生命周期,淘汰只是在内存压力下兜底。
  • 追问:LRU 和 LFU 区别是什么? LRU 看最近访问时间,LFU 看访问频率。
  • 追问:volatile 和 allkeys 区别是什么? volatile 只淘汰设置过期时间的 key,allkeys 面向所有 key。
  • 追问:如何选择策略? 缓存型 Redis 常用 allkeys-lru/lfu,混合存储要谨慎隔离。

八、加强记忆

Redis 淘汰策略解决内存满了删谁的问题。volatile 只淘汰有 TTL 的 key,allkeys 淘汰所有 key;LRU 看最近访问,LFU 看访问频率;noeviction 不删但写入报错。纯缓存常用 allkeys-lru/allkeys-lfu,混放重要数据要谨慎,最好隔离实例。策略之外还要控大 key、设合理 TTL、监控淘汰和命中率。