首页/数据/数据库速查/淘汰行为验证与监控(evicted_keys)
Redis 运维与场景124 条

淘汰行为验证与监控(evicted_keys)

观察淘汰是否生效:INFO stats 的 evicted_keys 持续增长说明在淘汰;配合 key 的 IDLETIME/FREQ 验证策略选择是否符合预期。

数据库速查数据更新于 2026-10-13

怎么看淘汰是否在发生

Redis 在内存达到 maxmemory 后按既定策略淘汰键,但这个过程是静默的:应用只会看到缓存命中率下降,实例不会报错。INFO stats 里的 evicted_keys 是累计淘汰数量,只要它在增长就说明确实在淘汰;配合 used_memory 与单个键的访问特征,可以判断策略选择是否与业务访问模式匹配。

基本信息

适用平台Redis 2.8+(LFU 需 4.0+)
相关参数maxmemory、maxmemory-policy、maxmemory-samples
观察字段evicted_keys、expired_keys、used_memory、used_memory_peak
策略族allkeys-lru/lfu、volatile-lru/lfu、allkeys-random、noeviction
辅助命令OBJECT IDLETIME、OBJECT FREQ

典型使用场景

  • 上线新缓存后确认淘汰策略是否按预期工作
  • 缓存命中率下降时判断是容量不足还是键设计问题
  • 切换 LRU 与 LFU 策略前后做效果对比
  • 排查写入成功但读不到数据的现象是否由淘汰引起
  • 容量规划:评估在现有内存下能保住的键规模

验证淘汰行为

验证淘汰行为
INFO stats | grep evicted_keys          # 累计被淘汰的键数,只增不减
INFO stats | grep expired_keys          # 自然过期的键数
INFO memory | grep -E 'used_memory_human|used_memory_peak_human|maxmemory_human'
CONFIG GET maxmemory-policy
# LRU 策略下观察单键空闲时间(秒)
OBJECT IDLETIME somekey
# LFU 策略下观察单键访问频率计数
OBJECT FREQ somekey
# 查看占用空间较大的键(低峰执行)
redis-cli --bigkeys

指标对照

指标含义判断方法
evicted_keys因内存不足被主动淘汰的键数持续增长说明正在淘汰
expired_keys因 TTL 到期被删除的键数与淘汰是两回事,不要混看
used_memory 与 maxmemory 的关系内存水位稳定贴近上限即处于持续淘汰状态
used_memory_peak历史峰值峰值远超当前值说明曾发生剧烈淘汰
命中率keyspace_hits 与 misses 的比值与 evicted_keys 同向恶化说明容量不足
命中率下降与 evicted_keys 同步上升,通常先说明内存不够或键设计有问题:优先排查大 key、没有 TTL 的键,然后再考虑扩容。
把 maxmemory-policy 设为 noeviction 时内存写满会直接返回错误而不是淘汰:数据安全性更高,但写入路径必须有失败处理,否则业务会持续报错。
淘汰是概率行为而非精确排序:LRU 与 LFU 都通过采样近似实现,maxmemory-samples 越大越接近真实使用规律,代价是每次淘汰判定更费 CPU。小内存实例不必调大,大实例可以适度提高。

易错点

  • 把 evicted_keys 与 expired_keys 混为一谈:一个是被内存压力挤掉,一个是自然到期,处置方向完全不同
  • 淘汰频繁却只盯命中率:无 TTL 的键与大 key 才是根因,不治理会一直消耗内存
  • 切换 LRU 与 LFU 策略后不重新评估:访问模式不同效果差异很大,需要观察一段时间再定论
  • maxmemory 设成接近机器物理内存:fork 快照阶段可能出现内存不足,需要预留余量

数据来源与参考

  • Redis 官方文档: INFO stats
  • Redis 官方文档: 键淘汰

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌