4. 内存淘汰策略总览:8种淘汰策略分类、适用场景、选择原则
Redis 的内存淘汰策略(Eviction Policy)决定了当 maxmemory 限制被触发时,系统如何选择并移除哪些键以释放空间。理解这 8 种策略的分类、适用场景与选择原则,是构建高命中率缓存系统的基石。
4.1 策略分类全景图
8 种策略可归为三大类:不淘汰、基于 LRU/LFU 近似算法、基于 TTL 随机淘汰。下图展示了完整的策略家族树:
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 选择原则与决策流程
选择淘汰策略时,建议按以下决策树逐步判断:
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 虽然命中率不适用,但在某些金融场景中,拒绝写入比错误淘汰更安全。