2025年Java面试宝典免费下载🔥
(点击蓝色链接立即获取,提取码:9b3g)
Redis数据一致性解决方案之Redis缓存穿透和缓存雪崩

作为程序员,面试被问到Redis缓存穿透和缓存雪崩的概率堪比被问"HashMap原理"。这两个问题本质都是缓存与数据库数据一致性的延伸场景。今天我们就以真实面试场景的口述逻辑,拆解这两个高频问题的应对方案。
Redis缓存穿透:请求穿破缓存的"黑洞"
什么是缓存穿透?
想象一个场景:黑客用10w个不存在的数据ID疯狂请求你的接口。这些请求会跳过Redis缓存直接访问数据库,导致数据库压力暴增甚至崩溃,这就是典型的缓存穿透。
穿透的三大解法
- 空值缓存:哪怕数据库查不到数据,也在Redis存个空值(比如"nil"),并设置短期过期时间(如30秒)。这样后续相同请求会直接命中缓存。
- 布隆过滤器拦截:在Redis前加一层布隆过滤器,提前预判数据是否存在。如果过滤器说"不存在",直接返回错误,避免请求打到数据库。
- 接口鉴权防御:对异常高频请求的IP或用户做限流,比如用Redis的incr命令统计请求次数,超过阈值就封禁。

Redis缓存雪崩:缓存的集体罢工
雪崩是如何发生的?
假设你的Redis集群中1000个key同时过期,这时海量请求直接涌向数据库,导致数据库被打挂——这就是缓存雪崩。更可怕的是,数据库崩溃后重启,又可能被新一轮请求再次击垮。
四步防雪崩策略
- 错峰过期时间:给每个key的过期时间加上随机数(比如基础时间+5分钟内的随机值),避免集体失效。
- 热点数据永不过期:对核心数据(如首页商品列表)采用"逻辑过期"策略:Redis不设置过期时间,而是后台异步更新数据版本。
- 互斥锁重建:当缓存失效时,用Redis的setnx命令加分布式锁,只允许一个线程去查数据库,其他线程等待锁释放后读取新缓存。
- 多级缓存架构:在Redis前增加本地缓存(如Caffeine),即使Redis崩溃,本地缓存仍能扛住部分流量。

实战中的组合拳
在实际项目中,往往会多种方案组合使用。比如:
- 对疑似恶意请求:布隆过滤器+空值缓存+接口限流
- 对热点数据:永不过期+本地多级缓存
- 对普通数据:随机过期时间+互斥锁重建
这里要特别注意:布隆过滤器有误判率,需要根据业务场景调整容量和哈希函数数量。而互斥锁方案可能导致短暂的系统延迟,需要做好超时机制。
需要Java面试资料的同学注意了:上文提到的2025年Java面试宝典已经更新了Redis高阶考点,包含穿透/雪崩/击穿的代码级解决方案。
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找我,返利25元!会员权益包含全年题库更新、大厂真题解析和一对一模拟面试,性价比超高。
(全文完)


