4. 缓存穿透原理:定义、产生原因、对系统的影响、典型业务场景
4.1 定义与核心特征
缓存穿透(Cache Penetration)是指查询一个根本不存在的数据,由于缓存层不命中,请求直接穿透到后端存储层(如数据库),导致存储层承受大量无效查询负载的现象。
与缓存击穿(热点 Key 失效)和缓存雪崩(大量 Key 同时失效)不同,缓存穿透的核心特征是:被查询的数据在存储层本身就不存在,因此无论请求多少次,都无法通过回填缓存来缓解压力。
关键判别标准: 缓存穿透 = 查询不存在的数据 → 每次穿透都直达数据库 → 数据库承受无效查询 → 无法通过缓存预热解决。
4.2 产生原因分析
缓存穿透的产生通常源于以下三类原因:
| 原因类别 | 具体描述 | 典型示例 |
|---|---|---|
| 恶意攻击 | 攻击者利用系统对外暴露的查询接口,批量请求不存在的数据 ID(如负数、超大值、随机字符串) | 遍历用户 ID 范围,请求 -1、0、99999999 等无效 ID |
| 业务逻辑缺陷 | 前端未做参数校验,或后端未对非法参数进行拦截,导致无效查询进入缓存层 | 搜索商品时传入空字符串或特殊字符 |
| 数据删除/过期不一致 | 存储层数据已被删除,但缓存层未同步失效,后续请求缓存未命中后查询数据库 | 用户注销后,缓存中用户信息未及时清理 |
4.3 对系统的影响
缓存穿透对系统的影响是渐进式且具有破坏性的,具体表现为以下四个维度:
- 数据库连接耗尽: 无效查询占用数据库连接池,导致正常业务查询等待超时。
- 数据库 CPU/IO 飙升: 大量重复的无效查询导致数据库负载急剧上升,可能触发慢查询或死锁。
- 缓存层空转: 缓存层虽然处理了请求,但每次都是未命中,缓存资源被无效消耗。
- 服务雪崩风险: 数据库扛不住压力后,上游服务因等待数据库响应而堆积请求,最终导致整个链路崩溃。
注意: 缓存穿透的破坏力与请求并发量成正比。在秒杀、抢购等场景下,即使只有 1% 的无效请求,也可能在瞬间打垮数据库。
4.4 典型业务场景
以下三类业务场景最容易出现缓存穿透问题:
- 用户信息查询: 用户 ID 由前端传入,攻击者可以构造不存在的用户 ID 进行遍历查询。
- 商品详情查询: 商品 ID 暴露在 URL 中,攻击者可以批量请求已下架或不存在的商品 ID。
- 短链接跳转: 短链接 Key 不存在时,每次请求都会查询数据库判断是否过期或被删除。
4.5 缓存穿透请求链路
下图展示了缓存穿透的完整请求链路,以及正常请求与穿透请求的对比:
4.6 缓存穿透与相关概念对比
为帮助理解缓存穿透的独特性,下表将其与缓存击穿、缓存雪崩进行对比:
| 对比维度 | 缓存穿透 | 缓存击穿 | 缓存雪崩 |
|---|---|---|---|
| 数据特征 | 数据根本不存在 | 热点数据过期 | 大量数据同时过期 |
| 触发条件 | 查询不存在 Key | 单个热点 Key 失效 | 大量 Key 同时失效 |
| 影响范围 | 所有不存在 Key 的请求 | 单个热点 Key 的请求 | 大量 Key 的请求 |
| 解决方案 | 布隆过滤器、空值缓存 | 互斥锁、热点 Key 永不过期 | 过期时间随机化、多级缓存 |
4.7 缓存穿透的量化影响
以下数据展示了缓存穿透在不同并发量下对数据库的实际冲击:
| 并发请求数 | 穿透比例 | 数据库 QPS | 数据库连接池(默认 50) | 系统状态 |
|---|---|---|---|---|
| 1000 | 1% | 10 | 正常 | 正常 |
| 10000 | 10% | 1000 | 紧张 | 响应变慢 |
| 100000 | 50% | 50000 | 耗尽 | 服务雪崩 |
实践建议: 在系统设计阶段,应将缓存穿透防护作为必选功能而非可选优化。建议在 API 网关层或业务入口处统一做参数校验和布隆过滤器拦截,避免穿透请求到达缓存层。