Redis缓存穿透问题及其解决方案

如果你在准备面试时被问到“Redis缓存穿透问题”,千万不要慌!这个问题几乎是技术面必考题,今天我们就从实际场景出发,彻底讲透Redis缓存穿透的原理、危害和解决方案。另外,文末还有一份《2025年Java面试宝典》网盘资源,包含高频Redis面试题解析,记得领取哦!
2025年Java面试宝典:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
什么是Redis缓存穿透?
缓存穿透是指查询一个数据库和缓存中都不存在的数据,导致每次请求都会直接打到数据库层。比如攻击者恶意发送大量无效的ID请求(如负数或极大值),缓存无法命中,数据库压力暴增,甚至可能引发宕机。
举个例子:
用户请求商品ID为“-100”的数据,缓存里没有,数据库里也没有,但每次请求都会穿透到数据库。如果这种请求每秒上万次,数据库可能直接崩溃。
Redis缓存穿透的三种解决方案
方案一:空值缓存
当查询到一个不存在的数据时,将空值(如“null”)写入缓存,并设置较短的过期时间(比如30秒)。这样后续请求会在缓存层被拦截,避免重复穿透。
适用场景:
- 数据不存在但请求参数相对有限(比如少量不存在的ID)。
- 对实时性要求不高的业务(例如商品详情页)。

方案二:布隆过滤器(Bloom Filter)
布隆过滤器是一种概率型数据结构,可以快速判断某个元素是否在集合中存在。将所有可能存在的Key预先存入布隆过滤器,请求到来时先检查过滤器:
- 如果不存在,直接返回空结果;
- 如果存在,再去查询缓存和数据库。
优点:
- 内存占用极低,适合海量数据场景。
- 查询效率高(时间复杂度O(1))。
缺点:
- 有一定误判率(可通过调整参数降低)。
- 需要预加载有效数据到过滤器。
方案三:接口限流与熔断
对于恶意请求或突发流量,可以通过限流工具(如Sentinel)限制每秒请求次数,或在数据库压力过大时触发熔断机制,暂时拒绝部分请求,保护数据库稳定性。
适用场景:
- 高并发业务或存在恶意攻击风险的系统。
- 需要与其他方案配合使用(例如先限流,再结合布隆过滤器)。
实际项目中如何选择方案?
-
组合使用更高效:
- 先用布隆过滤器拦截大部分无效请求,再对少量漏网之鱼采用空值缓存。
- 针对突增流量,叠加限流熔断机制。
-
注意细节:
- 空值缓存的过期时间不宜过长,避免占用过多内存。
- 布隆过滤器需要定期更新(如数据新增时同步到过滤器)。
-
监控与报警:
- 监控缓存命中率和数据库QPS,及时发现异常。
高频面试题解析
如果面试官追问:“布隆过滤器为什么会有误判?” 你可以这样回答:
布隆过滤器底层通过多个哈希函数计算位图位置,可能存在不同Key的哈希值落在相同位置,导致误判。但误判只会出现在“判定存在”时(实际不存在),而不会漏判(实际存在的一定能判定存在)。通常可以通过增加位图大小和哈希函数数量来降低误判率。

资源福利
如果想系统掌握Redis高频面试题(比如雪崩、击穿、集群等),推荐领取这份**《2025年Java面试宝典》**,涵盖大厂真题解析和技术深度剖析。
P.S. 如果需要购买面试鸭会员,可以通过面试鸭返利网(mianshiyafanli.com)找到我,成功下单后返利25元,帮你省下一杯咖啡钱!
本文首发于面试鸭返利网,转载请标注来源。


