Redis缓存穿透是面试必问的高频问题,指恶意请求不存在的数据导致数据库压力骤增。本文详解三大解决方案:空对象缓存通过存储特殊标记拦截无效请求;布隆过滤器利用哈希算法预先过滤非法Key;限流熔断机制保护系统免受过载冲击。针对不同场景提供技术选型建议,包括适用条件与优缺点对比。同时解答面试常见追问,如布隆过滤器误判原理、空对象缓存清理策略等。附赠2025年Java面试宝典下载链接,帮助开发者全面掌握Redis缓存穿透防御技巧,提升系统高可用性。

2025年Java面试宝典完整版已整理:
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
当面试官问“Redis缓存穿透”时,实际在考察你对缓存机制底层风险的理解。缓存穿透是指恶意请求根本不存在的数据,导致请求直接穿透Redis缓存层,压垮数据库。举个真实案例:
user_id=-1 这种非法ID
面试话术:
“我们会对数据库查询结果为空的Key,在Redis中缓存一个特殊空对象(比如
NULL_OBJECT),并设置较短过期时间(5-10分钟)。这样后续相同请求会命中Redis,避免穿透”
技术关键点:
cache:user:-1 -> "NULL"面试话术:
“在Redis前加布隆过滤器,把所有合法Key提前初始化。请求先过布隆过滤器:
- 若返回不存在,直接拦截请求
- 若返回可能存在,才查询Redis/DB”
落地注意点:
面试话术:
“针对频繁请求不存在的Key,用Redis实现滑动窗口限流:
- 对每个Key记录1分钟内的请求次数
- 超过阈值则触发熔断(如返回默认值)
- 结合网关层实现全局防护”
核心代码逻辑:
local key = "ratelimit:"..KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('GET', key) or 0
if current + 1 > limit then
return 0 -- 触发熔断
else
redis.call('INCR', key)
redis.call('EXPIRE', key, 60)
return 1
end
| 方案 | 适用场景 | 优缺点对比 | |---------------------|--------------------------|---------------------------| | 空对象缓存 | 数据量小,Key有限 | ✅ 实现简单 ⚠️ 内存占用增加 | | 布隆过滤器 | 海量数据,精确防御 | ✅ 内存高效 ⚠️ 存在误判率 | | 限流熔断 | 突发流量场景 | ✅ 系统级防护 ⚠️ 影响正常请求|
🚀 冲刺面试小贴士:
最近很多同学通过 面试鸭返利网 购买面试鸭会员,可额外返利25元(官方原价基础上立减)。需要时可去官网比价~

问:布隆过滤器为什么有误判?
答:因采用多哈希位图存储,不同Key的哈希组合可能重叠,导致误判为存在(实际不存在)
问:空对象缓存导致大量垃圾数据怎么办?
答:采用两层过期策略:
- 一级过期:5分钟后自动删除
- 二级清理:夜间定时扫描清理NULL对象
问:如何区分恶意请求和正常请求?
答:通过行为模式分析:
- 相同IP短时请求不同不存在Key
- 请求参数明显不符合业务规则
- 携带异常Header或Token
更多面试真题解析
点击访问 👉 面试鸭返利网 获取《Redis高频面试50题》完整题库,涵盖穿透/击穿/雪崩全场景解法!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

美团大额优惠券,给自己加个鸡腿吧!

今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包
