2025年Java面试宝典新鲜出炉!点击领取
🔗 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
Redis缓存穿透、缓存雪崩和缓存击穿原因以及解决方案
作为程序员,Redis的这三个经典问题几乎是面试必考题。今天咱们就用大白话聊聊它们的原理,以及实际开发中怎么解决。建议大家收藏这份攻略,下次被面试官问到直接甩出解决方案!

一、缓存穿透:查不到的数据疯狂攻击
问题原因
缓存穿透是指请求的数据既不在缓存中,也不在数据库里。比如黑客故意用大量非法ID(如-1或极大数值)发起请求,导致每次请求都直接打到数据库,最终可能压垮服务。
解决方案
- 布隆过滤器拦截非法请求
在缓存层前加布隆过滤器,判断请求的key是否存在。如果不存在直接返回,不给数据库留压力。 - 缓存空对象
即使数据库查不到,也在缓存中存一个空值(比如"null"),并设置短过期时间(30秒),防止重复攻击。 - 接口层校验
对参数合法性做校验,比如ID必须大于0、符合正则规则等,拦截明显异常的请求。
二、缓存雪崩:大批key同时过期

问题原因
缓存雪崩通常是因为大量key设置了相同的过期时间,导致某一时刻缓存集体失效,请求全部涌向数据库。比如双十一大促时,如果商品缓存同时过期,数据库可能瞬间被打爆。
解决方案
- 随机过期时间
在基础过期时间上增加随机值(比如30分钟±5分钟),分散key的失效时间。 - 热点数据永不过期
对核心数据(如首页推荐商品)设置永不过期,通过异步线程定期更新缓存。 - 多级缓存架构
用本地缓存(如Caffeine)+ Redis做多级缓存,即使Redis挂了还有本地缓存扛住部分流量。 - 熔断降级
配置Hystrix或Sentinel等熔断机制,当数据库压力过大时,暂时拒绝部分请求。
三、缓存击穿:热点key突然失效
问题原因
缓存击穿和雪崩类似,但针对的是某一个热点key。比如微博热搜突然失效,瞬间有百万级请求来查这个key,导致数据库崩溃。

解决方案
- 互斥锁重建缓存
当key失效时,用Redis的SETNX命令加锁,只允许一个线程去查数据库,其他线程等待或轮询。 - 逻辑过期时间
不依赖Redis的TTL,在value中存一个过期时间字段。发现过期后异步更新,期间旧数据仍可返回。 - 限流排队
用消息队列(如Kafka)缓冲瞬时高并发请求,控制数据库查询速率。
最后的小贴士
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找我,返利25元!新人首单还能叠加优惠券,性价比直接拉满!
实际开发中,这三大问题往往需要组合解决方案。比如用布隆过滤器防穿透+随机过期时间防雪崩+互斥锁防击穿。具体用哪些手段,要根据业务场景灵活调整。
(完)


