Redis 的淘汰策略触发前提是:我们在配置文件设置了 maxmemory 限制 Redis 最大可用内存,当写入数据导致内存达到上限后,就会执行内存淘汰逻辑。一共 6 种淘汰策略,可以分成三类来讲。

一、第一类:不淘汰数据 noeviction

默认策略 noeviction。 内存满了之后,所有写操作(set、hset 等新增 / 修改 key)直接返回报错,读命令不受影响。 适用场景:Redis 只存放固定配置、字典这类不会新增数据的静态数据。 做业务缓存绝对不能用这个策略,流量高峰期新增缓存直接大量报错,接口雪崩。

二、第二类:只淘汰带有过期时间的 key(volatile 系列)

只会在设置过 expire 的缓存 key 中挑选删除,永久存储的 key 会被保护,不会被清理。

  1. volatile-lru 在过期键里淘汰最近最少使用的数据。适合热点波动大、短期临时缓存的场景。
  2. volatile-lfu(Redis4.0 新增) 在过期键里淘汰访问频次最低的数据,长期热点数据能常驻内存,命中率更高,现在新项目优先选。
  3. volatile-ttl 只删除剩余过期时间最短的 key,适合统一短期失效的临时缓存,比如验证码、临时 token。
  4. volatile-random 过期 key 中随机删除,完全不区分冷热,缓存命中率极低,线上基本不用。

适用场景:Redis 混合存储,一部分是永久不失效的配置数据,一部分是带过期的业务缓存,不想把永久配置清掉,就选 volatile-lfu /volatile-lru。

三、第三类:所有 key 都参与淘汰(allkeys 系列)

不区分 key 是否设置过期时间,整个实例所有数据都参与淘汰。

  1. allkeys-lru 全局淘汰最少访问的 key,经典缓存方案。
  2. allkeys-lfu(推荐主流方案) 全局淘汰访问频次最低的 key,区分冷热效果比 LRU 更好,长期运行缓存命中率更高,绝大多数纯缓存项目用这个。
  3. allkeys-random 全局随机删数据,冷热不分,线上生产环境禁用。

适用场景:Redis 只用作缓存,不存在永久持久化的业务数据,追求高缓存命中率,优先 allkeys-lfu

四、补充两个面试高频考点

1. Redis 的 LRU / LFU 不是完整精准算法

为了不阻塞主线程、降低 CPU 消耗,Redis 不会维护全量访问链表。内部是随机抽取少量样本 key,在样本中对比冷热做近似淘汰,性能开销极小。

2. 线上业务选型总结(加分项)

  1. 纯缓存、无永久数据:maxmemory-policy allkeys-lfu(首选);
  2. 混合存储(永久配置 + 过期缓存):volatile-lfu
  3. 临时短时缓存(验证码、临时会话):volatile-ttl
  4. 禁止线上使用:noeviction、volatile-random、allkeys-random。

3. 配套配套配置不能漏

光配置淘汰策略不够,必须设置 maxmemory 限制内存; 同时配合过期删除机制(惰性删除 + 定期删除),提前清理过期数据,减少淘汰触发频率; 大对象删除使用 unlink 异步释放内存,避免主线程阻塞。

精简总结

Redis 内存淘汰一共 6 种策略,分为不淘汰、只删过期键、全量键淘汰三类;纯缓存业务优先 allkeys-lfu,混存永久数据用 volatile-lfu;默认 noeviction 不适合缓存场景。当内存达到 maxmemory 上限时自动触发,核心目的是控制内存占用、保证缓存正常写入。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐