Redis 雪崩和穿透有什么区别?
更新时间:2026-09-18。问题驱动短答页,完整方案与代码见深文 缓存穿透/击穿/雪崩。
一句话回答
- 穿透(penetration):请求的数据在数据库里根本不存在,缓存永远没有,于是每次请求都直接打到数据库(常见于恶意构造大量不存在的 id)。
- 雪崩(avalanche):数据是存在的,但一大批缓存 key 同时过期,或 Redis 整个节点宕机,导致海量请求在同一时刻全部落库,把数据库压垮。
记忆点:穿透是「查没有的东西」,雪崩是「缓存成片失守」。另外还有个容易混的击穿:一个热点 key 过期的瞬间,大量并发同时回源(单点,不是成片)。
对比表
| 名称 | 数据是否存在 | 影响范围 | 根因 |
|---|---|---|---|
| 穿透 | DB 里也不存在 | 大量非法 key | 无效查询绕过缓存 |
| 击穿 | 存在,是热点 | 单个 key 失效瞬间 | 热点并发回源 |
| 雪崩 | 存在 | 大批 key / 整节点 | 同时过期或缓存宕机 |
穿透怎么防
- 参数校验:非法 id(负数、格式错)在最外层直接挡掉。
- 布隆过滤器:查缓存前先过布隆,它说「不存在」就一定不存在,直接返回(会有假阳性,没有假阴性)。
- 空值缓存:查 DB 为空也写一个短 TTL 的空标记,避免同一不存在 key 反复落库。
雪崩怎么防
按两种成因分别处理:
大批 key 同时过期:
- TTL 加随机抖动,例如
过期时间 = 基础 TTL + random(0,300s),把失效时刻打散; - 不同类型数据设不同 TTL,别整批相同;
- 后台在过期前预热/续期,而不是等用户请求触发重建。
Redis 整体不可用:
- 多级缓存(进程内 Caffeine + Redis),热点在本地挡一层;
- Redis 主从 + Sentinel/Cluster 高可用;
- 数据库前加限流、熔断、降级兜底,宁可返回默认值也别让回源洪峰压垮 DB;
- 开持久化,重启后快速恢复热点。
顺带说清击穿
单个热点 key 失效瞬间的并发回源,用互斥锁只放一个请求去查库重建缓存(锁要带 TTL、释放时校验唯一 token,避免死锁和误删),或用逻辑过期:缓存不设物理 TTL、value 内带过期时间,读到旧值先返回、异步刷新。
相关与延伸
完整流程图、互斥锁伪代码、组合读写路径见 缓存穿透/击穿/雪崩;热点 key 本身的定位与打散见 BigKey/HotKey 诊断;高可用与分片见 Redis 主从与哨兵、Redis Cluster 槽位。
总结
穿透查的是数据库里也没有的数据、每次都落库,用参数校验 + 布隆过滤器 + 短 TTL 空值缓存;雪崩是大批 key 同时过期或 Redis 宕机造成成片落库,用 TTL 随机打散、多级缓存、主从/集群高可用和限流熔断降级;夹在中间的击穿是单个热点 key 失效瞬间,用互斥锁重建或逻辑过期异步刷新。