缓存穿透、击穿、雪崩一次讲清
发布时间:2025-12-29 21:19       
更新时间:2025-12-30 01:19
这三个词经常被放在一起说,实际是三种不同的缓存故障,触发原因不同,对策也不同。对照着记,比单独背概念清楚。
一、三个现象的区别
缓存穿透:查询数据库里也不存在的数据,典型是恶意请求 id=-1。缓存永远不命中,每次都打到数据库。
缓存击穿:某个热点 key 过期的瞬间,大量并发同时涌向数据库重建缓存。
缓存雪崩:大批 key 在同一时间集中过期,或缓存实例整体宕机,流量瞬间全压到数据库。
概括成三句话:穿透是"查不存在的数据",击穿是"一个热点失效",雪崩是"一批失效或整体不可用"。
二、各自的对策
对付穿透:空结果也做短缓存,比如存 60 秒空值,让后续同参数请求直接返回;入口再做参数校验,id 必须为正整数这类规则在网关层就拦掉。
对付击穿:热点 key 不设过期,或者用互斥锁重建——同一时刻只放一个请求去查数据库回填缓存,其余请求稍等再读缓存。
对付雪崩:过期时间加随机偏移,比如基础 30 分钟再加 0 到 5 分钟随机,把过期点打散;缓存做主从或集群,避免单点整体不可用。
三、一段场景推演
商品详情页缓存统一设 30 分钟、零点批量刷新,那零点就是雪崩高发时刻:全部 key 同时过期,数据库连接瞬间被打满。把过期时间加上随机偏移,或用定时任务提前逐个预热,压力就平了。整点活动、整点统计这类集中过期的场景,同样适用。
四、预防优先于补救
这三种故障的共同点:数据库被打挂之后,恢复需要时间,业务已经在受损。与其事后救火,不如上线前把空值缓存、互斥重建、过期打散三件事做掉,成本不高,收益长期。