连载中 17/20

命中率:缓存体系的核心指标

2026-06-03 · 4137 阅读 · 0 评论 · 0 赞

一个数字概括体系

前十六篇铺了满地的机制——穿透、击穿、雪崩、一致性、淘汰、多级——评价这套体系运转得好不好,最浓缩的指标就是缓存命中率

命中率 = keyspace_hits / (keyspace_hits + keyspace_misses)

分子是缓存里直接取走的请求,分母里多出来的那一截是白跑一趟去回源的。每个未命中都是一次 DB 查询、一段更长的 RT、一份更大的开销——命中率每掉一个点,底下 DB 的压力就多涨一片。多少算好?没有绝对线,读多写少的经典场景 90% 是及格线,95%~99% 是常态标杆;而写多读少、数据天然冷门的场景,命中率天然上不去,硬拉反而有害。

命中率低的三条病根

命中率偏低,按三条线排查。第一条:容量不够——内存满了开始淘汰,淘汰策略篇讲的 evicted_keys 持续增长,说明热数据还没来得及被再读就被挤走了,典型症状是命中率曲线跟着内存水位一起跳水;第二条:TTL 失配——过期太频繁,数据还没被读几次就没了,或者反过来 TTL 太长、脏数据引发业务问题被迫频繁手动清;第三条:访问模式本身冷——缓存的 key 里有大量长尾冷数据占着内存,真正的热点反而分不到预算,或者穿透污染(不存在的 key 被空值缓存占坑,穿透篇的空值缓存要配短 TTL 就是这个道理)。

看盘:别只盯一个总分

只看全局命中率会漏掉关键细节,几个配套指标要摆在一起看:命中率曲线——突变比数值更有信息量,发布时间点上的跳水十有八九是新版本改了 key 规则或 TTL;内存水位与 evicted_keys——判断是不是容量瓶颈;expire 与淘汰的比值——判断 key 是「自然过气」还是「被逼下岗」;分业务的命中率——全局 95% 可能掩盖了某个核心业务只有 70% 的事实,按业务前缀拆开统计(客户端埋点或 key 前缀聚合)才看清谁在拖后腿:

# Redis 侧的原始数据
INFO stats
#  keyspace_hits:1234567 keyspace_misses:23456 evicted_keys:789

# 按业务前缀拆分的命中率(客户端埋点聚合)
item:detail  --> 98.2%   核心业务,健康
user:feed    --> 61.5%   拖后腿,重点排查

养命中率:四件常规武器

对症下药的四板斧,全是前文的老朋友:预热(第 8 篇)——上线与大促前把热点灌进去,冷启动的空窗期不拉低曲线;合理的 TTL 加打散(第 5 篇)——按数据的更新节奏定 TTL,随机抖动防雪崩;容量规划——按热点数据规模定内存,maxmemory 留余量,淘汰策略选对;穿透防线(第 3 篇)——布隆过滤器与短 TTL 空值缓存,别让不存在的 key 污染统计与内存。四板斧之外还有一招兜底:命中率告警——跌破基线告到值班群里,缓存体系的故障大多先在命中率上显形,比 RT 报警更早。

命中率是果不是因——养它的手段,全是前十六篇的功夫。至此,应用层的读写姿势、Redis 自身的机制、监控的指标都已备齐,下一篇把整个体系画成一张全景图,合流收官。

503

10 年全栈工程师 · 503咖啡馆主理人

#缓存命中率#keyspace_hits#容量规划#TTL#监控告警

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 4 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞