Redis缓存击穿、缓存穿透、缓存雪崩:面试必问的三座大山

如果你正在准备Java面试,这里有一份宝贵的资料:2025年Java面试宝典(提取码:9b3g),建议立即保存到网盘。
作为程序员,Redis的高频面试题中,缓存击穿、缓存穿透、缓存雪崩这三个问题几乎是绕不开的坎。今天我们就以真实面试场景为例,用口语化的方式梳理它们的核心解决思路,帮你轻松应对面试官的“夺命连环问”!
一、Redis缓存击穿:单点失效引发的风暴
现象描述
缓存击穿指的是某个热点Key突然过期,而此时有大量并发请求涌入,直接穿透缓存打到数据库,导致数据库压力激增甚至崩溃。比如“双十一”秒杀活动的商品信息缓存失效,瞬间可能压垮系统。
核心解决思路
- 互斥锁(Mutex Lock):当发现缓存失效时,第一个请求加锁去查数据库,其他请求等待锁释放后直接读取缓存。
- 逻辑过期时间:不给Key设置物理过期时间,而是将过期时间写入Value。当发现数据逻辑过期时,异步更新缓存,避免阻塞请求。
- 永不过期+异步更新:对极热点数据设置永不过期,通过后台定时任务或消息队列更新数据。

二、缓存穿透:查无此数的攻击
现象描述
缓存穿透是指查询数据库中根本不存在的数据(比如恶意攻击者伪造的非法ID),导致请求直接绕过缓存访问数据库。这类问题可能被黑客利用发起DDoS攻击。
核心解决思路
- 空值缓存(Null Cache):将查询结果为空的Key也存入缓存,并设置较短过期时间(如5分钟)。
- 布隆过滤器(Bloom Filter):在缓存层前加布隆过滤器,过滤掉一定不存在的请求。注意布隆过滤器存在误判率,需定期同步数据库数据。
- 接口层校验:对请求参数做格式校验(如ID必须为数字),拦截非法参数。
三、缓存雪崩:大规模失效的灾难
现象描述
缓存雪崩是指大量Key同时过期,导致所有请求直接访问数据库,引发连锁故障。比如系统初始化时批量加载的缓存设置了相同的过期时间。
核心解决思路
- 随机过期时间:在基础过期时间上增加随机值(比如30分钟±5分钟),避免同时失效。
- 多级缓存架构:采用本地缓存(如Caffeine)+ Redis缓存的组合,即使Redis崩溃,本地缓存仍能扛住部分流量。
- 服务熔断降级:当数据库压力超过阈值时,触发熔断机制,直接返回默认值或错误页面,保护系统不被拖垮。

面试技巧与资源推荐
在回答这类问题时,一定要先明确问题边界(比如“击穿”是单Key失效,“雪崩”是多Key失效),再结合实际场景给出方案。如果面试官追问细节,可以从CAP理论、成本权衡等角度延伸。
小贴士:如果需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元,帮你省下一顿外卖钱!
无论是应对缓存击穿、穿透还是雪崩,核心思想都是降低数据库压力和提升系统容错能力。把这些解决方案吃透,面试时至少能拿个“B+”。最后提醒大家,技术文章看十遍不如亲手搭一遍,赶紧打开IDE写个Demo验证下吧!


