2. 缓存命中率低的现象识别
缓存命中率是衡量缓存效率的核心指标。当命中率显著下降时,会引发一系列可观测的业务与技术连锁反应。本章按照问题排查六步法,系统识别并定位缓存命中率低的根因。
2.1 现象识别
当 OkHttp 缓存命中率从正常值(如 85%+)骤降至 60% 以下时,通常表现为三组并发症状。
| 现象类别 | 监控指标 | 典型表现 |
|---|---|---|
| 业务指标下降 | DAU / 转化率 / 页面浏览量 | 关键业务数据下跌 5%–20% |
| 网络请求大量重复 | 请求量 / 带宽消耗 | 同一资源被多次请求,带宽激增 3 倍以上 |
| 响应延迟升高 | 页面加载时间 / API 响应时间 | 加载时间从 200ms 飙升至 2s 以上 |
注意:缓存命中率低通常不是孤立的性能问题,而是缓存策略、存储容量、并发冲突或数据一致性等因素共同作用的结果。仅凭单一现象无法定位根因,必须进行多维度数据采集。
2.2 数据采集
为准确定位根因,需要采集以下三类数据:
- 缓存命中率历史报告:通过 OkHttp 的
CacheStats或自定义Interceptor,收集命中/未命中计数及逐出记录。 - 网络请求日志:抓取所有出站请求的 URL、响应头(
Cache-Control、ETag、Last-Modified)及状态码。 - 响应时间分布:分析请求的完整耗时,区分缓存命中和未命中的延迟差异。
使用
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 复测
执行对比测试,验证命中率恢复:
- 部署修复后,运行批量请求模拟(覆盖 80% 以上业务接口)。
- 对比修复前后命中率数据:从 50% 恢复至 80%+ 即为有效。
- 监控业务指标是否同步回升,P95 响应时间是否降至 500ms 以下。
2.6 预防
- 建立缓存命中率基线告警:低于 60% 触发通知。
- 定期审计缓存策略与业务变化的一致性(如接口响应头变更)。
- 引入自动化测试,模拟高并发缓存场景,确保阈值卡口有效。