很多团队设置了 maxmemory-policy,就以为 Redis 会像一个精确缓存那样自动保留最有价值的数据。这个理解有风险:Redis 的 LRU/LFU 都是近似算法。

当 used_memory 超过 maxmemory,Redis 会根据策略选择候选 key。候选不是全量排序,而是采样;策略也要区分 allkeys、volatile 和 noeviction。

先把机制边界说清楚

这一篇讨论内存达到上限后的淘汰决策,不讨论过期删除。过期是 key 的生命周期,淘汰是内存压力下的牺牲选择。

整体路径

maxmemory 触发后的淘汰决策

上面这张图先把主线铺开:策略决定候选池,采样决定被淘汰对象。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • allkeys-* 可以从所有 key 中淘汰,适合纯缓存实例。
  • volatile-* 只淘汰设置了 TTL 的 key,适合缓存和非缓存混用时的有限保护。
  • LRU 和 LFU 都通过元信息和采样近似实现,不维护全局精确链表。
  • noeviction 会在内存不足时让写命令报错,读命令仍可继续。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

淘汰策略不是兜底神器。把缓存数据和准持久数据混在同一个实例里,再指望策略自动理解业务优先级,迟早会翻车。

典型问题:用机制化例子排查

  • 纯缓存实例优先 allkeys-lfuallkeys-lru,业务状态数据尽量独立实例。
  • 使用 volatile-* 时确保应被淘汰的 key 都设置了 TTL。
  • 监控 evicted_keys、hit rate 和内存曲线,淘汰增加说明容量或热点模型已变化。
  • 不要用淘汰策略掩盖大 key、热 key 和缓存雪崩问题。

收束:一句判断

淘汰策略能帮你降级,但不能替你做数据分级。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码