软件技术 · 知识点深化 · 分布式系统
缓存穿透、击穿、雪崩:三兄弟一次分清
缓存用不好比不用还惨。穿透、击穿、雪崩是缓存三大经典问题,名字像但解法完全不同。这一页用三张图把它们分清,面试不再混淆。
① 怎么学(4 步走,约 60 分钟)
先建立直觉再抠细节,按这四步走最稳:
1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 区分穿透/击穿/雪崩;② 各自解决方案;③ 设计缓存更新策略。
② 一图看懂:缓存三大问题
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。
③ 本质直觉:缓存三兄弟
穿透:查一个数据库里根本不存在的数据。缓存没有,每次都打到 DB。像穿墙——缓存挡不住,直接打到数据库。解法:布隆过滤器拦截空值。
击穿:某个超热点 key 恰好过期,瞬间上万请求同时打到 DB。像一个点被打穿。解法:互斥锁重建缓存、热点 key 不过期。
雪崩:大量 key 同一时刻过期,DB 瞬间压力暴增。像整面墙塌了。解法:过期时间加随机值,错开过期。
Cache Aside 模式读:先读缓存,miss 再读 DB 回填。写:先更新 DB,再删缓存。不要先删缓存再更新 DB(并发会脏)。
④ 完整知识体系
三兄弟对比
| 问题 | 现象 | 解法 |
| 穿透 | 查不存在的 key | 布隆过滤器/缓存空值 |
| 击穿 | 热点 key 过期瞬间 | 互斥锁/热点永不过期 |
| 雪崩 | 大量 key 同时过期 | 过期时间加随机值 |
缓存空值查 DB 不存在也缓存一个 null,短 TTL,防反复穿透
过期随机expire = base + random(0,300s) 错峰
布隆过滤器
启动时把所有存在的 key 放入布隆过滤器。请求先过布隆:判断不存在就直接返回,不查缓存和 DB。有误判率但能挡住绝大多数穿透。
⑤ 应用场景与例题
例1 恶意请求 id=-1 反复打
穿透怎么防?
布隆过滤器判断 -1 不存在,直接返回。或者缓存空值短 TTL。
例2 热搜榜 key 过期瞬间 1 万 QPS
击穿怎么解?
用 SETNX 互斥锁,只让一个线程查 DB 重建缓存,其他线程等或返回旧值。热点 key 也可以逻辑过期。
例3 缓存重启后所有 key 同时过期
雪崩怎么解?
过期时间加随机抖动,比如本来 1 小时,加 random 0-10 分钟,错峰重建。
做题心法穿透挡不存在,击穿锁热点,雪崩错过期。
⑥ 高频错误诊断(4 条)
错误1:三个问题用一个解法穿透用布隆,击穿用锁,雪崩用随机 TTL,别混。
错误2:写操作先删缓存再更 DB并发读会把旧值回填。应先更 DB 再删缓存。
错误3:缓存空值永不过期空值也要设短 TTL,否则真有数据了读不到。
错误4:热点 key 设短 TTL热点 key 逻辑过期或永不过期,后台异步更新。
⑦ 考点真题演练(5 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 穿透 | 问解法 | 布隆/空值 |
| 击穿 | 问解法 | 互斥锁 |
| 雪崩 | 问解法 | 随机过期 |
| 更新 | 问写策略 | 先更DB再删缓存 |
真题basic1. 查询数据库中不存在的数据导致每次打 DB,叫?
真题mid2. 热点 key 突然过期,大量请求打到 DB,叫?
真题mid3. 大量 key 同时过期导致 DB 压力暴增,解法是?
真题hard4. 缓存写操作推荐策略?
真题hard5. 防止穿透可以用?
⑧ 必背知识点卡
穿透:查不存在,布隆/空值
击穿:热点 key 过期,互斥锁重建
雪崩:大批同时过期,TTL 加随机
读:Cache Aside,miss 查 DB 回填
写:先更 DB 再删缓存
空值:短 TTL,别永不过期
热点:逻辑过期,异步更新
⑨ 动手输出:排查线上 DB 压力大问题
场景:DB CPU 突然 100%,缓存命中率骤降。
① 看监控:是所有 key 还是个别 key?
② 全部 miss:雪崩,检查是否大量 key 同时过期或 Redis 重启。
③ 个别热点 miss:击穿,看热点 key TTL。
④ 不存在的请求多:穿透,加布隆。
⑤ 修复:错峰 TTL、互斥重建、布隆拦截。
口述思路先看监控定位是哪个问题,再用对应解法。
⑩ 分层练习(基础 + 中档 + 拔高)
▍基础 6 题
基础1穿透是什么?
查不存在的数据,缓存挡不住。
基础2击穿是什么?
热点 key 过期瞬间大量请求打 DB。
▍中档 5 题
中档1为什么先更 DB 再删缓存?
先删缓存并发读会把旧值回填。
中档2布隆过滤器原理?
多位哈希,判断不存在一定不存在,存在可能误判。
中档3热点 key 为什么不直接永不过期?
数据变更时要主动删缓存,逻辑过期。
中档4缓存空值 TTL 设多久?
短时间,如 30-60 秒。
中档5双删策略是什么?
更 DB 后删缓存,延迟再删一次,防并发脏读。
▍拔高 5 题
拔高1布隆过滤器误判率?
存在可能判存在(误判),不存在一定不存在。
拔高2缓存预热怎么做?
上线前提前把热点数据加载到缓存。
拔高3互斥锁重建缓存怎么实现?
SETNX 拿锁的线程查 DB 回填,其他 sleep 重试。
拔高4为什么要逻辑过期?
物理过期会击穿;逻辑过期返回旧数据异步更新。
拔高5缓存和 DB 一致性怎么保证?
先更 DB 删缓存+订阅 binlog 最终一致。
⑪ 记忆口诀 + 7 天复习计划
三句口诀① 穿透挡不存在,布隆空值。② 击穿锁热点,互斥重建。③ 雪崩错过期,随机抖动。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画三兄弟对比图 | 现象分清 |
| 第 2 天 | 背对比表 + 基础 6 题 | 解法对应 |
| 第 3 天 | 做中档 5 题,写 Cache Aside | 读写流程 |
| 第 4 天 | 做拔高 5 题,设计布隆方案 | 误判理解 |
| 第 5 天 | 做⑦真题 5 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合书口述三问题区别 | 不看资料 |
← 返回软件技术总览