Redis缓存穿透、击穿、雪崩,三个词搞混了你就完了
做后端开发的,面试被问Redis几乎是必考题。但很多人把缓存穿透、击穿、雪崩这三个概念搞混了,面试一紧张就答串。今天用最直白的方式说清楚。
缓存穿透:查不存在的数据
你查一个数据库里压根没有的ID,比如有人故意传ID=-1。缓存查不到,去数据库查也查不到,结果每次请求都直接打到数据库。如果有人写个脚本疯狂请求,数据库直接被压垮。
解决方案很简单:缓存空值。查到数据库没有结果时,往Redis里写一个空对象,设个短过期时间(比如5分钟)。下次同样的请求直接命中缓存,不用再打数据库。更狠一点可以用布隆过滤器,提前拦截明显不合法的请求。
缓存击穿:热点Key突然失效
某个热点数据(比如双十一的爆款商品)刚好过期了,这时候大量请求同时涌入,全部打到数据库上。数据库瞬间压力暴增。
解决办法:给热点Key加互斥锁。用Redis的SETNX命令加锁,只有一个请求能去查数据库,其他请求等着。等第一个请求把数据写回缓存后,后续请求直接命中缓存。另一个办法是热点Key永不过期,后台异步更新。
缓存雪崩:大面积Key同时失效
这不是单个Key的问题,是很多Key在同一时间过期。比如你批量导入数据时都设了相同的过期时间,到点了全部失效,所有请求瞬间打到数据库。
预防措施:过期时间加随机值。比如基础过期时间是1小时,每个Key再加上0-10分钟的随机偏移。这样Key会分散过期,不会同时崩掉。另一个方案是多级缓存——本地缓存(Caffeine/Guava Cache)兜底第一层,Redis兜底第二层,数据库兜底第三层。
一句话总结
穿透是查不存在的数据,击穿是热点Key失效,雪崩是大批Key同时失效。搞清楚这三个的区别,面试和实际开发都不会出问题。




提供云计算服务