1. 缓存穿透原理与危害
1.1 缓存穿透的定义
缓存穿透是指客户端请求的数据在缓存层和数据库中均不存在,导致每次请求都直接穿透缓存层,直达后端数据库的现象。由于缓存无法命中,所有请求都转化为对数据库的查询,使得缓存层形同虚设。
核心特征:缓存未命中 + 数据库无记录 = 每次请求都穿透到数据库层。
1.2 请求直接打到数据库的场景分析
缓存穿透通常发生在以下典型场景中:
| 场景类型 | 具体描述 | 典型示例 |
|---|---|---|
| 恶意攻击 | 攻击者构造大量不存在的 Key 发起请求,绕过缓存直接攻击数据库 | 查询用户 ID = -1、ID = 99999999 等不存在的数据 |
| 业务误操作 | 前端或上游服务传入非法参数,导致查询不存在的数据 | 商品详情页传入已被删除的商品 ID |
| 缓存预热不足 | 系统刚上线或缓存过期后,大量请求同时访问冷数据 | 秒杀活动开始瞬间,热门商品 Key 尚未加载到缓存 |
| 数据自然不存在 | 用户搜索的关键词在系统中确实没有对应记录 | 搜索不存在的订单号、不存在的用户名 |
关键判断:缓存穿透与缓存击穿不同。穿透是数据根本不存在,击穿是数据存在但缓存过期。穿透的危害更隐蔽,因为无法通过延长缓存有效期来解决。
1.3 对数据库和系统的危害
缓存穿透对数据库和整个系统架构的危害是多层次的,从瞬时冲击到长期稳定性问题,具体表现如下:
- 数据库连接池耗尽:大量穿透请求同时到达数据库,导致连接池被占满,正常请求也无法获取连接,引发级联故障。
- 数据库 CPU/IO 飙升:无效查询消耗数据库计算资源,导致慢查询增多,整体吞吐量急剧下降。
- 系统响应延迟增加:数据库成为瓶颈后,请求排队等待,响应时间从毫秒级恶化到秒级甚至超时。
- 缓存层资源浪费:缓存服务器虽然未命中,但仍需处理请求解析、Key 查找等操作,浪费了缓存层的计算和网络资源。
- 雪崩效应风险:数据库压力过大导致宕机后,依赖该数据库的其他服务也相继不可用,引发系统级雪崩。
⚠️ 实际案例:某电商平台在促销期间遭遇恶意攻击,攻击者遍历不存在的商品 ID(如 1000000~2000000),导致数据库 QPS 从 2000 飙升至 50000,数据库连接池 3 秒内耗尽,核心商品查询接口超时率达 98%,最终触发熔断,影响持续 20 分钟。
1.4 危害量化指标
以下表格展示了缓存穿透在不同并发量下对数据库的实际影响,帮助评估风险等级:
| 并发穿透请求数 | 数据库 QPS 增量 | 平均响应时间 | 系统风险等级 |
|---|---|---|---|
| 100 QPS | +100 | 5~10 ms | 低风险 |
| 1,000 QPS | +1,000 | 50~200 ms | 中风险 |
| 10,000 QPS | +10,000 | 500 ms~2 s | 高风险 |
| 100,000 QPS | +100,000 | 超时/连接失败 | 严重风险 |