先确认maxmemory-policy是否为allkeys-lru或volatile-lru,否则maxmemory-samples无效;再核验config get返回值是否被截断;最后用keyspace_hits率和evicted_keys变化交叉验证淘汰精度,避免依赖object idletime等误导指标。

直接看 evicted_keys 和 keyspace_hits 的变化,而不是猜“它是不是更准了”
先确认参数真正在起作用
执行 CONFIG GET maxmemory-policy,如果返回不是 allkeys-lru 或 volatile-lru,那 maxmemory-samples 压根不参与任何淘汰逻辑——哪怕你设成 200 也毫无影响。常见误判是策略配成了 noeviction 或 allkeys-random,却还在调 samples。
再执行 CONFIG GET maxmemory-samples,注意它可能被静默截断:设了 300,返回的仍是 200,且不报错。线上必须二次确认返回值,不能信自己输的数。
用两个指标交叉验证精度变化
真正反映淘汰是否“更准”的,不是采样数变大了,而是业务缓存行为有没有改善:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
keyspace_hits / (keyspace_hits + keyspace_misses)—— 缓存命中率。升了,说明热 key 被误删少了;降了,大概率是采样扩大后反而抽中并淘汰了不该删的活跃 key -
evicted_keys增速是否异常放缓或突增。比如从每秒淘汰 120 个降到 80 个,同时命中率上升,说明淘汰更聚焦冷数据;但如果 evicted_keys 没变,而延迟毛刺变多,那只是 CPU 白花了
别拿 OBJECT IDLETIME 验证“谁最老”
OBJECT IDLETIME 返回的是秒级估算值,本身不准,且在 LFU 模式下含义完全不同(返回的是衰减分钟数 + 频次权重)。很多监控脚本靠它判断冷热 key,结果全错。它不能用来反推 maxmemory-samples 是否生效。
真正该盯的是 redis-cli --stat 输出的实时节奏:evicted_keys 和 instantaneous_ops_per_sec 是否强相关?如果 OPS 涨 10%,evicted_keys 涨 40%,说明淘汰压力已开始干扰正常请求,这时候调高 samples 可能雪上加霜。
压测时只比 P99 eviction-time-us
精度提升的代价是延迟。不要只看平均耗时,重点看 INFO stats 中的 eviction-time-us 的 P99 分位:
- 从 5 改到 7,P99 通常从 ~120μs 升到 ~210μs
- 超过 10,P99 容易突破 300μs,在高并发写入场景下会堆积淘汰任务
- 如果业务 SLA 要求单请求延迟
复杂点在于:精度不是线性收益。从 5 到 7 有明显改善,但从 10 到 15,误淘汰率几乎不变,CPU 开销却翻倍——容易被忽略的是,你调的不是“准确度”,而是“CPU 换延迟预算”。










