数据库
技术随笔
Redis 缓存穿透、击穿、雪崩:原理与解决方案
引入 Redis 缓存后,系统扛住了大部分读请求,但缓存一旦出问题,流量会直接打到数据库。缓存穿透、击穿、雪崩是三个最典型的故障场景,面试和实战中都高频出现。
一、缓存穿透
查询一个根本不存在的数据,缓存和数据库都没有,请求每次都打到数据库。
解决方案:① 接口层做参数校验;② 缓存空值(设短过期时间);③ 使用布隆过滤器(BloomFilter)拦截不存在的 key。
二、缓存击穿
某个热点 key 在过期瞬间,大量并发同时来查询,瞬间击穿到数据库。
解决方案:① 热点 key 不过期或逻辑过期;② 互斥锁(如 Redis 的 SETNX)只放一个请求回源,其余等待。
三、缓存雪崩
大量 key 在同一时间集中过期,或 Redis 宕机,导致数据库瞬时压力暴增。
解决方案:① 给过期时间加随机值,错开失效点;② 集群部署 + 高可用(哨兵/Cluster);③ 限流降级,保护数据库。
四、一句话总结
| 问题 | 原因 | 对策 |
|---|---|---|
| 穿透 | 查不存在的数据 | 空值缓存 / 布隆过滤器 |
| 击穿 | 热点 key 过期 | 互斥锁 / 不过期 |
| 雪崩 | 大量 key 同时失效 | 过期随机化 / 高可用 |