主题
Redis 缓存异常三件套(穿透 / 击穿 / 雪崩)
一句话机制:三者本质都是「缓存没挡住、请求穿透到 DB」,但成因不同:穿透=查不存在的数据、击穿=热点 key 过期并发查同一条、雪崩=大量 key 同时失效/Redis 宕机。
不变量(必须成立的约束)
- 缓存穿透:查询一个一定不存在的 key,缓存与 DB 都没有,每次都打到 DB。解法:①接口/参数校验(过滤非法 ID);②缓存空值(短 TTL);③布隆过滤器前置拦截。
- 缓存击穿:某个热点 key 过期瞬间,大量并发同时查这条数据,齐刷刷穿透到 DB。解法:①互斥锁(只放一个请求回源);②逻辑过期/永不过期(异步刷新);③限流。
- 缓存雪崩:大量 key 同一时刻失效或 Redis 宕机,瞬间海量请求压垮 DB。解法:①过期时间加随机值打散;②Redis 高可用(哨兵/Cluster);③降级/熔断/限流;④多级缓存。
- 布隆过滤器特性:说不存在 → 一定不存在;说存在 → 可能不存在(有误判);不支持删除,需重建。
关键证据 / 例子
- 布隆过滤器误判源于哈希冲突;Redisson
RBloomFilter.tryInit(预期元素, 误判率)自动算 bit 数组大小。 - 雪崩与击穿区别:击穿是「单点热点」,雪崩是「批量 key」;二者都靠「错峰过期 + 锁/限流」缓解。
常见误解(高频混淆点)
- ❌❌「缓存击穿 = 黑客查不存在数据」——这是穿透,不是击穿!这是面试资料最常见的混淆(多个源把击穿段落写成了穿透的内容)。记忆锚点:穿透=查不到的 key;击穿=热点 key 过期;雪崩=一堆 key 同时没。
- ❌「布隆过滤器说存在就一定能找到」——错,布隆过滤器有假阳性;它只能 100% 保证「不存在」。
- ❌「缓存空值能彻底解决穿透」——空值缓存只能挡「业务空数据」,挡不住恶意遍历攻击,需配合布隆过滤器 + IP 限流。
- ❌「加分布式锁就能解决一切」——锁能挡击穿/雪崩的并发回源,但雪崩还需错峰过期与高可用,单靠锁会拉低吞吐。
关联
- 来源:Redis常见面试题(面试-叶区分清晰;吊打源存在击穿/穿透混淆,已校正)
- 相关:Redis技术栈总览、概念卡片:Redis缓存与数据库一致性