4. 缓存穿透原理:定义、产生原因、对系统的影响、典型业务场景

4.1 定义与核心特征

缓存穿透(Cache Penetration)是指查询一个根本不存在的数据,由于缓存层不命中,请求直接穿透到后端存储层(如数据库),导致存储层承受大量无效查询负载的现象。

与缓存击穿(热点 Key 失效)和缓存雪崩(大量 Key 同时失效)不同,缓存穿透的核心特征是:被查询的数据在存储层本身就不存在,因此无论请求多少次,都无法通过回填缓存来缓解压力。

关键判别标准: 缓存穿透 = 查询不存在的数据 → 每次穿透都直达数据库 → 数据库承受无效查询 → 无法通过缓存预热解决。

4.2 产生原因分析

缓存穿透的产生通常源于以下三类原因:

原因类别 具体描述 典型示例
恶意攻击 攻击者利用系统对外暴露的查询接口,批量请求不存在的数据 ID(如负数、超大值、随机字符串) 遍历用户 ID 范围,请求 -1、0、99999999 等无效 ID
业务逻辑缺陷 前端未做参数校验,或后端未对非法参数进行拦截,导致无效查询进入缓存层 搜索商品时传入空字符串或特殊字符
数据删除/过期不一致 存储层数据已被删除,但缓存层未同步失效,后续请求缓存未命中后查询数据库 用户注销后,缓存中用户信息未及时清理

4.3 对系统的影响

缓存穿透对系统的影响是渐进式且具有破坏性的,具体表现为以下四个维度:

  1. 数据库连接耗尽: 无效查询占用数据库连接池,导致正常业务查询等待超时。
  2. 数据库 CPU/IO 飙升: 大量重复的无效查询导致数据库负载急剧上升,可能触发慢查询或死锁。
  3. 缓存层空转: 缓存层虽然处理了请求,但每次都是未命中,缓存资源被无效消耗。
  4. 服务雪崩风险: 数据库扛不住压力后,上游服务因等待数据库响应而堆积请求,最终导致整个链路崩溃。
注意: 缓存穿透的破坏力与请求并发量成正比。在秒杀、抢购等场景下,即使只有 1% 的无效请求,也可能在瞬间打垮数据库。

4.4 典型业务场景

以下三类业务场景最容易出现缓存穿透问题:

  • 用户信息查询: 用户 ID 由前端传入,攻击者可以构造不存在的用户 ID 进行遍历查询。
  • 商品详情查询: 商品 ID 暴露在 URL 中,攻击者可以批量请求已下架或不存在的商品 ID。
  • 短链接跳转: 短链接 Key 不存在时,每次请求都会查询数据库判断是否过期或被删除。

4.5 缓存穿透请求链路

下图展示了缓存穿透的完整请求链路,以及正常请求与穿透请求的对比:

缓存穿透请求链路对比图 缓存穿透请求链路对比 客户端 缓存层 数据库 请求 Key 返回数据 请求不存在 Key 穿透到 DB 查询不存在 穿透特征 ① 缓存未命中 ② 直达数据库 ③ 数据库无数据 穿透请求 vs 正常请求对比 正常请求: 客户端 → 缓存命中 → 直接返回(绿色路径) 穿透请求: 客户端 → 缓存未命中 → 穿透到数据库 → 返回空(红色路径) 后果: 数据库承受全部无效查询压力,连接池耗尽,服务雪崩

4.6 缓存穿透与相关概念对比

为帮助理解缓存穿透的独特性,下表将其与缓存击穿、缓存雪崩进行对比:

对比维度 缓存穿透 缓存击穿 缓存雪崩
数据特征 数据根本不存在 热点数据过期 大量数据同时过期
触发条件 查询不存在 Key 单个热点 Key 失效 大量 Key 同时失效
影响范围 所有不存在 Key 的请求 单个热点 Key 的请求 大量 Key 的请求
解决方案 布隆过滤器、空值缓存 互斥锁、热点 Key 永不过期 过期时间随机化、多级缓存

4.7 缓存穿透的量化影响

以下数据展示了缓存穿透在不同并发量下对数据库的实际冲击:

并发请求数 穿透比例 数据库 QPS 数据库连接池(默认 50) 系统状态
1000 1% 10 正常 正常
10000 10% 1000 紧张 响应变慢
100000 50% 50000 耗尽 服务雪崩
实践建议: 在系统设计阶段,应将缓存穿透防护作为必选功能而非可选优化。建议在 API 网关层或业务入口处统一做参数校验和布隆过滤器拦截,避免穿透请求到达缓存层。