
2025年Java面试宝典网盘地址:
点击获取 提取码: 9b3g
Redis缓存穿透、雪崩、击穿的解决方案
在面试中,Redis的缓存问题是必考题,尤其是缓存穿透、雪崩和击穿这三种异常场景的处理方案。今天我们就从实际开发的角度,分析这三大问题的核心解决思路,帮助大家在面试中从容应对这类技术追问。
一、缓存穿透:穿透防御的3种手段
缓存穿透是指查询一个数据库中不存在的数据(比如不存在的用户ID),由于缓存不命中,导致每次请求都直接打到数据库,造成数据库压力过大。
解决方案:
- 空值缓存:当数据库查不到数据时,在Redis中缓存一个空值(比如
key:null),并设置较短的过期时间(如5分钟)。 - 布隆过滤器:在Redis和数据库之间加一层布隆过滤器,预存所有合法的数据标识(比如用户ID)。请求进来先经过布隆过滤器校验,若不存在则直接返回。
- 接口限流:对高频请求的接口做限流(例如使用Redis的INCR命令计数),防止恶意攻击穿透到数据库。

二、缓存雪崩:如何避免集体失效?
缓存雪崩是指大量缓存同时过期,导致请求全部转发到数据库,引发数据库崩溃。
解决方案:
- 随机过期时间:在设置缓存过期时间时增加随机值,例如基础时间+随机1~5分钟,避免同一时间大量Key失效。
- 热点数据永不过期:对核心业务数据(如首页推荐商品)不设置过期时间,通过异步线程定期更新。
- 多级缓存架构:采用本地缓存(如Caffeine)+分布式缓存(Redis)的多级结构,即使Redis崩溃,本地缓存仍能扛住部分流量。
面试常见追问:
“如果Redis集群挂了怎么办?”
可以回答:“我们会通过熔断机制(如Hystrix)暂时拒绝部分请求,同时从备份的本地缓存或数据库中降级获取数据。”
三、缓存击穿:高并发下的单点防御
缓存击穿是指某个热点Key突然过期,此时大量并发请求直接穿透到数据库,导致数据库压力激增。
解决方案:
- 互斥锁(Mutex Lock):当缓存失效时,只允许一个线程去查数据库并重建缓存,其他线程等待(比如用Redis的SETNX命令实现锁)。
- 逻辑过期时间:缓存数据本身不设置过期时间,而是在数据中存储一个逻辑过期时间字段。业务代码判断是否过期,若过期则触发异步更新。
- 预刷新机制:对于已知的热点Key(比如秒杀商品),在过期前主动刷新缓存,避免高峰期失效。

四、实战中的组合策略
在实际项目中,通常需要综合多种方案:
- 分层防御:布隆过滤器拦截非法请求 → 随机过期时间避免雪崩 → 互斥锁解决击穿。
- 监控报警:通过Prometheus监控缓存命中率和数据库QPS,异常时触发告警。
- 压测验证:定期对缓存场景做压力测试,确保方案的可靠性。
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元!近期很多同学通过这种方式节省了会员费用,性价比非常高。
总结
Redis的三大缓存问题本质上是流量与数据一致性的权衡,核心思路是:拦截非法请求、分散失效时间、降低并发压力。大家在面试中回答时,记得结合业务场景举例说明(比如电商秒杀、社交热点),更能体现实际经验。


