4. 内存淘汰策略总览:8种淘汰策略分类、适用场景、选择原则

Redis 的内存淘汰策略(Eviction Policy)决定了当 maxmemory 限制被触发时,系统如何选择并移除哪些键以释放空间。理解这 8 种策略的分类、适用场景与选择原则,是构建高命中率缓存系统的基石。

4.1 策略分类全景图

8 种策略可归为三大类:不淘汰、基于 LRU/LFU 近似算法、基于 TTL 随机淘汰。下图展示了完整的策略家族树:

Redis 8种内存淘汰策略分类树 Redis 淘汰策略 不淘汰 LRU / LFU 近似 TTL / 随机 noeviction allkeys-lru / allkeys-lfu volatile-lru / volatile-lfu allkeys-random volatile-random volatile-ttl 说明 volatile-* 系列只对设置了 TTL 的键生效;allkeys-* 系列对所有键生效。 noeviction 不淘汰任何键,写入失败返回 OOM 错误。

4.2 8种策略详细对比

策略名称 分类 淘汰范围 核心算法 命中率倾向
noeviction 不淘汰 无 不淘汰,写入报错 —
allkeys-lru LRU 近似 所有键 近似 LRU(采样淘汰) 高(热点数据)
allkeys-lfu LFU 近似 所有键 近似 LFU(频率计数) 高(访问频率)
volatile-lru LRU 近似 设置了 TTL 的键 近似 LRU 中高
volatile-lfu LFU 近似 设置了 TTL 的键 近似 LFU 中高
allkeys-random 随机 所有键 随机选取 低
volatile-random 随机 设置了 TTL 的键 随机选取 低
volatile-ttl TTL 优先 设置了 TTL 的键 选取剩余 TTL 最短的键 中(依赖 TTL 设置)

4.3 适用场景速查

  • noeviction:用于纯缓存不可丢失的场景,或已做独立内存监控,禁止 Redis 自动淘汰。
  • allkeys-lru:最常用策略。适用于大多数缓存场景,热点数据访问模式明显,期望最大化命中率。
  • allkeys-lfu:适用于访问频率差异极大的场景(如秒杀商品、热门文章),LFU 能更精准保留高频键。
  • volatile-lru / volatile-lfu:适用于混合存储——部分数据持久化(无 TTL),部分数据可淘汰(有 TTL)。
  • allkeys-random:适用于数据访问均匀、无热点的场景,或用于快速测试淘汰行为。
  • volatile-random:极少使用,仅当 TTL 键集合很大且淘汰顺序无关紧要时。
  • volatile-ttl:适用于业务上明确知道“即将过期的数据优先淘汰”的场景,如临时会话缓存。

4.4 选择原则与决策流程

选择淘汰策略时,建议按以下决策树逐步判断:

Redis 淘汰策略选择决策流程 开始选择策略 允许自动淘汰? noeviction 所有键都可淘汰? allkeys-lru / allkeys-lfu 按 TTL 淘汰? volatile-ttl volatile-lru / volatile-lfu 决策要点 优先考虑 allkeys-lru;若访问频率差异极大则选 allkeys-lfu;混合持久化场景选 volatile-* 系列。

4.5 配置与验证

在 redis.conf 中配置淘汰策略:

# 设置最大内存(单位:字节)
maxmemory 2gb

# 设置淘汰策略
maxmemory-policy allkeys-lru

# 采样数量(影响淘汰精度,默认5)
maxmemory-samples 10

运行时动态修改:

# 查看当前策略
CONFIG GET maxmemory-policy

# 动态修改(无需重启)
CONFIG SET maxmemory-policy allkeys-lfu

# 查看淘汰统计
INFO stats | grep evicted_keys
实践建议:生产环境推荐 allkeys-lru 作为默认策略。如果业务数据访问频率差异极大(如 80% 请求集中在 5% 的键上),可切换为 allkeys-lfu。采样数 maxmemory-samples 建议设为 10,在淘汰精度与 CPU 开销之间取得平衡。

4.6 命中率影响分析

不同策略对缓存命中率的影响可归纳为以下对比:

策略 命中率等级 典型场景命中率 风险点
allkeys-lru ★★★★★ 95%+(热点集中) 周期性扫描可能误淘汰热点
allkeys-lfu ★★★★★ 97%+(频率差异大) 新热点冷启动慢
volatile-lru ★★★★☆ 85%~92% 无 TTL 键无法淘汰
volatile-ttl ★★★☆☆ 75%~85% 依赖 TTL 设置合理性
allkeys-random ★★☆☆☆ 50%~65% 可能淘汰热点键
noeviction — 不淘汰,写入失败 服务不可用风险
注意:命中率并非唯一指标。选择策略时还需考虑写入吞吐、内存碎片率、数据一致性要求。例如 noeviction 虽然命中率不适用,但在某些金融场景中,拒绝写入比错误淘汰更安全。