监控面板显示缓存命中率 99.7%,数据库 QPS 仍然 1.2 万,扩容两次没有效果,看代码才发现查到 null 也记了一次 hit。日志里能对上时间点,这种反而好排。
统计把缓存里有值和无值都算命中,空值缓存挡住的请求被当成有效命中。本地缓存命中没有单独上报,两层数据混在一起看不出问题。这一点先确认清楚,后面就不用反复试。
hit = cache.get(key) != null ? 1 : 0; // null 单独记 miss,回源次数单独计数
「缓存命中率失真」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:命中、空值命中、未命中分开计数;回源次数单独打点 和数据库 QPS 对账;按 key 前缀看命中率 找出一直返回空值的那批。
结果对不对很好判断,拆开统计后真实命中率是 62%,空值占 31%,回源次数与数据库 QPS 对得上。
