缓存穿透、击穿、雪崩?
在真实的系统里,它是一条链路上的三环,一开始是某个接口被人用不存在的id疯狂的请求,缓存查不到,每次穿透到数据库,这个就是穿透,数据压力就开始上来,响应开始变慢,这个时候有一个热点的Key过期,上万并发的瞬间全砸到数据库上,这个就是击穿,数据库本来就被穿透搞得半死不活了,这一下就懵了,直接雪崩,穿透是导火线,击穿是放大器,雪崩是最终的结果。
要站在系统架构的层面,拿出一套分层防御的方案。
第一层挡住穿透,布隆过滤器能用,但它有误判率,只能算第一道过滤网,更完善的做法是,查不到数据也别让请求空着回去,缓存一个空值,给30秒的过期时间,布隆过滤器加空值缓存,两层基本挡住了;
第二层挡住击穿,热点key过期,互斥锁能让你查库的动作串行化,要注意,如果并发量真的大,大部分请求都在等锁,响应时间就会飙升,更务实的做法就是热点数据,根本不让它过期或者用逻辑过期,让前台的请求先用旧数据顶一下,后台再去偷偷更新;
第三层挡雪崩,过期时间加随机值,但是这个只能预防,真正的兜底是熔断和降级,数据库一旦扛不住,直接熔断,返回个默认值或者缓存的旧数据,数据可以短暂的不一致,但系统绝对不能崩。
AI总结:
这是缓存架构中三个经典的失效问题:缓存穿透、缓存击穿、缓存雪崩。三者是不同场景下的缓存失效风险,并非严格的递进关系,但在高并发场景下会叠加放大,最终可能引发数据库服务雪崩。
一、先理清三个概念与核心差异
先纠正一个常见的逻辑误区:三者不是必然的 “穿透→击穿→雪崩” 递进关系,而是对应三种不同的失效场景,严重程度和影响范围不同:
- 缓存穿透:请求大量不存在的业务 ID,缓存中没有对应数据,请求全部穿透到数据库,属于无效流量持续施压,会持续抬高数据库的基础负载。
- 缓存击穿:单个热点 Key 过期失效,瞬间大量并发请求全部打到数据库,属于单热点的瞬时流量冲击,针对的是单条高访问量数据。
- 缓存雪崩:大量热点 Key 在同一时间集体过期,或缓存服务整体宕机,全量流量瞬间打到数据库,属于批量失效的全面冲击,最容易直接引发数据库过载崩溃。
补充关联:穿透带来的持续无效压力会降低数据库的承载阈值,此时再发生击穿或批量过期,会更容易触发全链路雪崩。
二、三层分层防御架构
站在系统架构层面,应该搭建「拦截无效流量→管控热点并发→兜底系统可用性」的三层防御体系,层层降低数据库的冲击风险。
第一层:防御缓存穿透 —— 双层拦截无效请求
核心目标:把不存在的 ID 拦截在数据库之外,避免空流量持续穿透。
采用布隆过滤器 + 空值缓存的双层组合:
- 第一层:布隆过滤器粗筛
预先把全量合法业务 ID 存入布隆过滤器,所有请求先经过过滤器校验:过滤器判定不存在的 ID,直接返回,无需查缓存和数据库。- 特点:存在一定误判率(判定存在的不一定真的存在,判定不存在的一定不存在),适合做第一道过滤网,拦截绝大多数无效请求。
- 第二层:空值缓存兜底
对于布隆过滤器漏判的、数据库确实不存在的 ID,在缓存中写入一个空标记值,并设置较短的过期时间(比如 30 秒)。- 作用:短时间内相同的无效请求直接被缓存拦截,不会重复穿透数据库。
- 注意:空值过期时间不宜过长,避免数据新增后长期无法命中。
第二层:防御缓存击穿 —— 管控热点 Key 重建
核心目标:热点 Key 过期时,避免海量并发同时去数据库重建缓存。
有两种主流方案,根据业务场景选择:
- 互斥锁方案(强一致场景)
缓存失效时,用分布式互斥锁控制:只放行一个请求去数据库查询并重建缓存,其余请求阻塞等待,缓存重建完成后直接读取。- 优缺点:保证数据一致性,但高并发下大量请求阻塞等待,响应时间会明显上升;适合并发量中等、数据一致性要求高的场景。
- 逻辑过期方案(高并发场景,生产更务实)
热点 Key 不设置物理过期时间,而是在 Value 中附带逻辑过期时间戳。请求时发现逻辑过期,立刻返回旧数据给前端,同时后台异步启动线程去更新缓存。- 优缺点:高并发下无请求阻塞,性能最好,但存在短暂的数据不一致;适合秒杀、热点推荐等对一致性容忍度高、优先保证可用性的场景。
第三层:防御缓存雪崩 —— 分散风险 + 熔断兜底
核心目标:避免大量 Key 同时过期,以及数据库过载时的自我保护。
- 预防手段:过期时间打散
在统一的过期时间基础上,给每个 Key 增加一个随机浮动值(比如 ±5 分钟),打散 Key 的过期时间点,避免大量 Key 集中在同一时刻失效。- 作用:从根源降低批量同时过期的概率,是雪崩的基础预防方案。
- 兜底手段:服务熔断与降级
监控数据库的核心指标(连接数、响应时间、错误率),一旦达到阈值立即触发熔断:前端请求不再透传到数据库,直接返回降级结果(比如缓存旧数据、默认值、业务友好提示)。- 核心设计思想:允许短暂的数据不一致,优先保证系统整体可用性,绝对不能让数据库被打垮导致全链路雪崩。
三、核心设计总结
整套架构的本质是分层治理、逐级降压:
- 外层拦无效,减少不必要的数据库请求;
- 中层控并发,把并行的缓存重建串行化或异步化;
- 底层做兜底,极端情况下牺牲一致性保可用性。

浙公网安备 33010602011771号