Redis 缓存穿透、缓存击穿、缓存雪崩 核心区别对比
先一句话定性,再给场景、原因、危害、解决方案对比,超好记。
- 缓存穿透 :查不存在的数据,缓存、数据库都没有,请求直打数据库。
- 缓存击穿 :热点 Key 过期瞬间,大量请求同时打到数据库。
- 缓存雪崩 :大量 Key 同时过期 / Redis 宕机,缓存整体失效,流量全部压垮数据库。
一、详细对比表
| 对比维度 | 缓存穿透 | 缓存击穿 | 缓存雪崩 |
|---|---|---|---|
| 核心场景 | 查询数据库根本没有的数据 | 单个热点 Key 缓存过期 | 大批量 Key 同时过期 / Redis 挂了 |
| 请求流向 | 缓存没 → 数据库也没 | 缓存刚好过期失效 → 全打 DB | 缓存大面积失效 → 流量全冲 DB |
| 触发原因 | 恶意请求、参数非法、空数据查询 | 热点 Key 设置相同过期时间 | 1. 批量 Key 过期时间集中2. Redis 宕机 / 断电 / 集群故障 |
| 攻击 / 影响范围 | 分散、恶意爬虫 / 黑客攻击 | 单点热点流量瞬间打崩 | 全局、大面积服务雪崩、DB 瘫痪 |
| 典型例子 | 查 id=-1、乱输手机号、不存在商品 ID | 秒杀商品、首页热门商品 Key 过期 | 凌晨所有缓存统一 1 小时过期,整点集体失效 |
二、各自解决方案
1. 缓存穿透 解决
- 缓存空值 / 空对象,设置短期过期
- 布隆过滤器:拦截不存在的 Key,请求压根不到 Redis
- 接口层参数校验,非法参数直接拦截
- 黑名单过滤恶意请求
2. 缓存击穿 解决
- 热点 Key 永不过期(不设置 expire)
- 互斥锁(分布式锁):只放一个请求去查 DB、更新缓存
- 逻辑过期:后台异步更新缓存,不删 Key
3. 缓存雪崩 解决
- 过期时间加随机值,打散过期时间,避免集中失效
- Redis 高可用:主从 + 哨兵 / 集群,避免单点宕机
- 服务层限流、降级、熔断
- 多级缓存:本地 Caffeine + Redis 二级缓存
三、最简记忆口诀
- 穿透:查无此物,两头都空
- 击穿:单点热点,过期瞬间
- 雪崩:集体失效,全军覆没