2. 缓存命中率低的现象识别

缓存命中率是衡量缓存效率的核心指标。当命中率显著下降时,会引发一系列可观测的业务与技术连锁反应。本章按照问题排查六步法,系统识别并定位缓存命中率低的根因。

2.1 现象识别

当 OkHttp 缓存命中率从正常值(如 85%+)骤降至 60% 以下时,通常表现为三组并发症状。

现象类别监控指标典型表现
业务指标下降DAU / 转化率 / 页面浏览量关键业务数据下跌 5%–20%
网络请求大量重复请求量 / 带宽消耗同一资源被多次请求,带宽激增 3 倍以上
响应延迟升高页面加载时间 / API 响应时间加载时间从 200ms 飙升至 2s 以上
注意:缓存命中率低通常不是孤立的性能问题,而是缓存策略、存储容量、并发冲突或数据一致性等因素共同作用的结果。仅凭单一现象无法定位根因,必须进行多维度数据采集。
缓存命中率低的现象识别与影响链路 缓存命中率低 业务指标下降 网络请求重复 响应延迟升高 用户感知体验差 服务器负载增加 关键预警指标 缓存命中率 < 50% | 请求重复率 > 30% | P95 响应时间 > 2s 业务指标(DAU/转化率)连续 15 分钟下降超过 5%

2.2 数据采集

为准确定位根因,需要采集以下三类数据:

  1. 缓存命中率历史报告:通过 OkHttp 的 CacheStats 或自定义 Interceptor,收集命中/未命中计数及逐出记录。
  2. 网络请求日志:抓取所有出站请求的 URL、响应头(Cache-Control、ETag、Last-Modified)及状态码。
  3. 响应时间分布:分析请求的完整耗时,区分缓存命中和未命中的延迟差异。
使用 EventListener 可以高效采集这些指标,无需侵入业务代码。

2.3 原因定位

使用故障树分析法,梳理可能的原因:

故障模式排查点判断规则
缓存容量不足缓存目录大小限制、DiskLruCache 最大条目数若限制过小,大量数据被逐出,命中率骤降
无效的缓存策略服务端返回的 Cache-Control、Expires 等头若为 no-cache、no-store 或 max-age=0,则缓存无效
URL 变异导致不命中检查请求 URL 是否包含时间戳、随机数等同资源 URL 不同 → 无法复用缓存
并发写入冲突多线程同时更新缓存可能导致脏读或数据不一致,降低有效命中率

2.4 修复动作

  • 调整缓存容量:根据业务数据量合理设置 DiskLruCache 的 maxSize。
  • 优化缓存策略:与后端协作,确保合适资源设置合理的 max-age,启用 ETag 和 Last-Modified。
  • 标准化 URL:删除查询参数中的随机因子,或使用缓存键规范化工具。
典型配置示例:new Cache(cacheDirectory, 100 * 1024 * 1024); 即设置 100MB 缓存。

2.5 复测

执行对比测试,验证命中率恢复:

  1. 部署修复后,运行批量请求模拟(覆盖 80% 以上业务接口)。
  2. 对比修复前后命中率数据:从 50% 恢复至 80%+ 即为有效。
  3. 监控业务指标是否同步回升,P95 响应时间是否降至 500ms 以下。

2.6 预防

  • 建立缓存命中率基线告警:低于 60% 触发通知。
  • 定期审计缓存策略与业务变化的一致性(如接口响应头变更)。
  • 引入自动化测试,模拟高并发缓存场景,确保阈值卡口有效。