Redis缓存穿透解决方案:面试必问的高频问题详解

2025年Java面试宝典完整版已整理:
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
一、什么是Redis缓存穿透?
当面试官问“Redis缓存穿透”时,实际在考察你对缓存机制底层风险的理解。缓存穿透是指恶意请求根本不存在的数据,导致请求直接穿透Redis缓存层,压垮数据库。举个真实案例:
- 黑客高频请求
user_id=-1这种非法ID - Redis查无此数据(未缓存)
- 所有请求直击MySQL
- 数据库连接池被打满,服务宕机

二、三招破解缓存穿透
✅ 方案1:空对象缓存(最常用)
面试话术:
“我们会对数据库查询结果为空的Key,在Redis中缓存一个特殊空对象(比如
NULL_OBJECT),并设置较短过期时间(5-10分钟)。这样后续相同请求会命中Redis,避免穿透”
技术关键点:
- 缓存键规范:
cache:user:-1 -> "NULL" - 过期时间动态调整:高频攻击Key设置更短TTL
- 异步更新机制:避免缓存雪崩
✅ 方案2:布隆过滤器(大数据量场景)
面试话术:
“在Redis前加布隆过滤器,把所有合法Key提前初始化。请求先过布隆过滤器:
- 若返回不存在,直接拦截请求
- 若返回可能存在,才查询Redis/DB”
落地注意点:
- 误判率设置:通常0.01%需约14个哈希函数
- 数据更新同步:DB新增数据时需更新布隆过滤器
- 内存优化:1亿数据约114MB内存
✅ 方案3:请求限流与熔断
面试话术:
“针对频繁请求不存在的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题》完整题库,涵盖穿透/击穿/雪崩全场景解法!


