2025年Java面试宝典下载地址 提取码: 9b3g
Redis缓存穿透:当请求变成无底洞
咱们在面试中最怕被问到这类实战场景题:"Redis缓存穿透怎么解决?" 这问题看似简单,但要说清楚底层原理和完整方案还真得好好理一理。
什么是缓存穿透?想象一个恶意攻击场景:黑客用根本不存在的用户ID轮番轰炸系统。Redis查不到这些key,请求直接穿透到数据库,最终导致数据库崩溃。这种查询不存在数据的现象,就是我们说的Redis缓存穿透。

核心解决方案有这三个:
- 布隆过滤器拦截:在Redis前加个过滤器,像门卫一样检查请求的key是否存在。注意布隆过滤器有误判率,需要根据业务场景调整参数
- 空值缓存:即使数据库查不到数据,也在Redis里存个特殊标记(比如"NULL"),并设置较短过期时间,避免重复穿透
- 接口校验:对请求参数做格式校验,比如用户ID必须是数字,非数字直接拦截
缓存雪崩:当灾难集体爆发
比单个key穿透更可怕的是缓存雪崩——大量缓存同时失效,或者Redis集群宕机,导致所有请求瞬间涌向数据库。
举个例子:某电商平台把商品缓存都设置成2小时过期,结果凌晨2点所有缓存集体失效,数据库瞬间被打垮。这就是典型的缓存雪崩场景。

破局之道有这些关键点:
- 随机过期时间:给每个key的过期时间加个随机数(比如基础时间+0~30分钟的随机值),避免集体失效
- 集群高可用:采用Redis Cluster搭建集群,主从节点+哨兵机制确保故障自动转移
- 熔断降级:引入Hystrix等熔断器,当数据库压力过大时自动降级,返回预设默认值
- 多级缓存架构:本地缓存+Redis+数据库的三层架构,本地缓存作为最后防线
数据一致性保障策略
说到Redis缓存穿透和缓存雪崩的解决方案,必然会牵扯到数据一致性问题。这里有两个经典策略:
双删策略特别适合更新场景:
- 先删Redis数据
- 再更新数据库
- 最后延迟再删一次Redis(防止并发请求在更新间隙写入旧数据)
异步更新更适合读多写少的场景:
- 将更新操作写入消息队列
- 通过订阅机制逐步更新缓存
- 配合版本号控制,避免脏数据

如果大家准备面试需要系统化的资料,不妨试试面试鸭返利网购买会员。通过该平台找我下单,还能返利25元,相当于用更实惠的价格获取最新的面试题库和架构方案解析。
最后提醒下,缓存穿透和缓存雪崩的解决方案不是非此即彼的关系,实际项目中往往是多管齐下。比如先用布隆过滤器拦截非法请求,再通过随机过期时间分散热点key,最后用熔断机制保护数据库,这样才能构建起立体的防护体系。


