缓存穿透、击穿、雪崩本质均为缓存失效导致请求直冲数据库:穿透是查不存在的key,击穿是热key过期瞬间并发打库,雪崩是大批key同时过期或Redis宕机引发流量洪峰。

缓存穿透、击穿和雪崩是 Redis 使用中三类典型故障,本质都是缓存未能有效拦截请求,导致数据库被突发流量压垮。它们成因不同,防御思路也需差异化处理。
缓存穿透:防“空查”直冲数据库
用户反复查询根本不存在的数据(如 id=-1、随机大数 ID),缓存不命中、DB 也无结果,每次请求都穿透到底层。恶意攻击时尤为危险。
- 参数校验前置:接口层拦截明显非法值,比如 ID ≤ 0、超长字符串、非数字格式,直接返回 400,不进缓存和 DB
- 缓存空值(NULL 标记):DB 查询为空时,向 Redis 写入一个轻量标记(如字符串 "NULL"),设置短过期时间(3–5 分钟),避免重复空查
- 布隆过滤器兜底:启动时将所有有效主键加载进布隆过滤器;请求进来先过滤器判断——若返回“不存在”,则直接拒绝,不查 Redis 和 DB;注意它有极低误判率,但绝无漏判
缓存击穿:保“热点”不失效断档
单个高热 key(如秒杀商品、热搜榜单)恰好过期,瞬间大量并发请求同时落库,造成数据库瞬时压力峰值。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 逻辑过期 + 异步重建:缓存值内嵌一个逻辑过期时间字段;过期后不删除 key,而是由首个请求触发异步更新,其余请求仍返回旧数据,保证可用性不中断
- 分布式互斥锁(mutex key):key 失效时,用 SETNX 尝试设置一个临时锁 key;仅抢到锁的线程查 DB 并回填缓存,其他线程短暂等待或降级返回
- 永不过期 + 主动刷新:对核心热点数据设为永不过期,搭配定时任务或消息队列定期刷新缓存,避免自然过期引发集中冲击
缓存雪崩:避“批量失效”连环崩溃
大量 key 同一时刻过期(如批量预热时统一设 TTL=1 小时),或 Redis 整体宕机,导致全量请求涌向数据库。
- 过期时间加随机偏移:基础 TTL(如 3600 秒)叠加随机值(如 0–600 秒),打散过期分布,避免扎堆失效
- 多级缓存兜底:本地缓存(如 Caffeine)+ Redis 组合使用;Redis 不可用时,本地缓存仍可抗住部分读流量,争取故障恢复时间
- 服务降级与熔断:监控缓存命中率、DB QPS 等指标,低于阈值时自动启用静态默认值、限流或快速失败,防止雪崩扩散
实际落地中,建议按业务风险等级组合使用:中小系统优先用空值缓存 + 随机 TTL;高并发核心链路应引入布隆过滤器 + 逻辑过期 + 多级缓存;金融、电商等关键场景还需配套熔断告警与压测验证。

















