这三个词经常被混着说,其实场景不一样,应对方式也不同。
缓存穿透
现象:查一个数据库里也不存在的 key,缓存没命中,每次都打到 DB。
场景:恶意攻击用不存在的 ID 刷接口。
应对:
- 缓存空值,设短过期时间(比如 60 秒)
- 布隆过滤器,判断 key 是否可能存在
- 参数校验,非法 ID 直接拒绝
缓存击穿
现象:某个热点 key 过期瞬间,大量请求同时打到 DB。
场景:首页 banner、秒杀商品。
应对:
- 互斥锁:只让一个请求去加载,其他等待
- 热点 key 永不过期,后台异步更新
- 逻辑过期:value 里存过期时间,异步刷新
缓存雪崩
现象:大量 key 同一时间过期,或者 Redis 挂了,请求全打到 DB,DB 扛不住连锁崩。
应对:
- 过期时间加随机值,避免同时失效
- Redis 高可用(哨兵/集群)
- 本地缓存做二级缓冲
- DB 层限流、熔断降级
一张表总结
| 问题 | 原因 | 核心思路 |
|---|---|---|
| 穿透 | 查不存在的数据 | 拦截无效请求 |
| 击穿 | 热点 key 过期 | 互斥加载 |
| 雪崩 | 大量 key 同时失效 | 打散过期时间 + 高可用 |
实际做缓存,先想清楚「哪些数据能缓存、过期多久、失效了怎么办」,比背概念有用。

Comments 3 条评论
三个终于讲清楚了,之前一直混
缓存空值设短过期这个常用
过期时间加随机值是标配了