文档首页> 技术教程> 缓存穿透、击穿、雪崩一次讲清

缓存穿透、击穿、雪崩一次讲清

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