命中率与内存的平衡是什么
给缓存更多内存通常能提升命中率,但收益递减:热数据总量有限,超过这个量之后,新加的内存只用来装更冷的键。反过来,命中率下滑而内存还没用满时,问题多半不在容量,而在过期时间设置、键设计或访问模式变化。
基本信息
| 核心指标 | keyspace_hits 与 keyspace_misses |
|---|---|
| 推导口径 | 命中率 = hits /(hits + misses) |
| 权衡关系 | 内存换命中率的边际收益递减 |
| 排查顺序 | 先查 TTL 与键设计,再考虑扩容 |
| 联动指标 | evicted_keys、expired_keys、maxmemory |
典型使用场景
- 容量评审:判断扩容能否换来可感知的命中率提升,避免为指标而扩容
- 命中率下跌定位:内存未满时优先查过期时间与键前缀的变化
- 冷热分离:把热数据与归档数据分开存储,避免冷键挤占预算
- 大促前评估:访问分布短期改变时,命中率波动未必是容量问题
- 成本沟通:用边际收益说明继续扩容的性价比,便于与业务方对齐
指标采集
指标采集
redis-cli INFO stats | grep -E 'keyspace_hits|keyspace_misses' # 累计命中与未命中
redis-cli INFO stats | grep -E 'expired_keys|evicted_keys' # 过期与淘汰是否抢走热键
redis-cli INFO keyspace # 各库键数量与过期键比例
redis-cli CONFIG GET maxmemory-policy # 策略决定热键是否会被挤掉
redis-cli TTL hot:key # 抽查热键的剩余存活时间
redis-cli DBSIZE # 当前键总数快速确认规模指标联动读法
| 组合现象 | 可能原因 | 处理方向 |
|---|---|---|
| 命中率降、内存未满 | TTL 过短或键设计被改 | 核对过期时间与键前缀 |
| 命中率降、淘汰上升 | 容量不足,热键被挤掉 | 扩容或调整策略与采样 |
| 命中率稳、内存持续涨 | 键基数扩大,冷键变多 | 收敛键设计或增加归档层 |
| 命中率与内存都平稳 | 状态健康 | 保持现状,不必为指标扩容 |
命中率要按业务维度拆开看:全局命中率会被大量低频查询稀释,整体数字健康并不意味着热点接口没问题。
扩容前后各取一个完整业务周期对比,短窗口的命中率受流量结构影响很大,容易得出相反结论。