2. 缓存穿透:定义、产生原因与系统影响
2.1 定义
缓存穿透是指客户端请求的数据在缓存层和数据库层中都不存在,导致每次请求都直接穿透缓存层,直达后端数据库。由于缓存层无法命中,这些请求会持续对数据库造成压力,如同在缓存层上“打穿”了一个洞。
核心特征:缓存不命中 + 数据库也不存在该数据 → 请求绕过缓存,直击数据库。
2.2 产生原因
缓存穿透通常由以下三类场景引发:
| 原因分类 | 具体描述 | 典型示例 |
|---|---|---|
| 恶意攻击 | 攻击者利用系统漏洞,批量请求不存在的数据 ID(如负数、超大值、随机字符串),绕过缓存直接攻击数据库。 | 请求 /user?id=-1 或 /product?id=abc123xyz |
| 业务误操作 | 上游系统或运维人员错误地推送了不存在的数据主键,导致大量无效查询。 | 数据迁移后未同步缓存,旧 ID 仍被调用 |
| 缓存与数据库数据不一致 | 数据已被删除,但缓存未及时失效,请求到达缓存后未命中,再查询数据库也返回空。 | 用户注销后,缓存 TTL 未到,仍被频繁查询 |
排查要点:当监控发现缓存命中率突然从 95% 以上骤降至 60% 以下,且数据库 QPS 同步飙升时,应优先怀疑缓存穿透。
2.3 对系统的影响
缓存穿透对系统的影响是连锁式的,从缓存层逐步传导至数据库层,最终可能导致整个服务不可用。
2.4 影响量化指标
以下指标可用于评估缓存穿透的严重程度:
| 指标 | 正常范围 | 穿透预警阈值 | 穿透严重阈值 |
|---|---|---|---|
| 缓存命中率 | ≥ 95% | < 90% | < 70% |
| 数据库 QPS | 基线值 ± 20% | 基线值 × 2 | 基线值 × 5 |
| 数据库连接池使用率 | ≤ 60% | > 80% | > 95% |
| P99 响应时间 | ≤ 50ms | > 200ms | > 1s |