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 分钟。
缓存穿透危害链路 缓存穿透危害链路 大量穿透请求 缓存未命中 数据库压力激增 数据库宕机 连接池耗尽 CPU/IO 飙升 响应延迟恶化 系统雪崩 ❄️

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 超时/连接失败 严重风险