缓存穿透、击穿、雪崩本质不同:穿透是查不存在数据,击穿是单热点key过期瞬间并发冲击,雪崩是大批key集中失效或Redis宕机;需分别通过前置拦截、热点保护、分散过期与架构兜底精准防控。

缓存穿透、击穿、雪崩是 Redis 使用中最容易引发数据库过载的三类典型问题,它们成因不同、影响范围不同,必须区分对待、精准防控。
缓存穿透:查的是压根不存在的数据
本质是请求绕过缓存,反复查询数据库中也不存在的 key(比如 id=-1、随机字符串),导致数据库被无效请求打垮。
常见于恶意攻击、参数校验缺失或数据已删但缓存未同步。
应对重点是“提前拦截 + 有效兜底”:
- 接口层做基础校验(如 ID > 0、格式匹配),非法请求直接拒掉
- 查询数据库为空时,写入空值到 Redis,设置短 TTL(例如 2–5 分钟),避免重复穿透
- 高并发场景叠加布隆过滤器:启动时预热所有合法 key,请求先过过滤器,判定“一定不存在”则直接返回,不查缓存也不查库
缓存击穿:单个热点 key 过期瞬间被挤爆
比如秒杀商品、热搜文章等超高频 key 到期后,大量并发请求同时击穿缓存直达数据库。
核心矛盾是“高并发 + 单点失效”。
关键策略是“错峰重建 + 保护热点”:
- 用互斥锁(如 Redis 的 SETNX 或 Redisson 分布式锁):只放行一个线程查库并回填缓存,其余等待或重试
- 改用逻辑过期:value 中嵌入过期时间戳,物理 key 永不过期;后台异步刷新,接口即使逻辑过期也返回旧值,保证可用性
- 避免给热点 key 设置统一 TTL,可结合业务节奏做缓存预热
缓存雪崩:大面积缓存集体失能
表现为大批量 key 同一时刻过期,或 Redis 整体宕机,导致所有请求瞬间涌向数据库。
影响面最广,风险最高。
治理思路是“分散失效 + 架构冗余”:
- 设置随机过期时间:在基础 TTL 上加 1–10 分钟随机偏移,打散过期峰值
- 多级缓存配合:本地缓存(如 Caffeine)+ Redis 组合,降低对单一缓存节点的依赖
- 加强容灾能力:Redis 主从+哨兵/集群部署,配合服务降级与请求限流(如 Sentinel 或 Resilience4j)
不复杂但容易忽略。











