缓存穿透怎么解决?面试官最爱问的高并发场景解决方案
先给大家发个福利!2025年Java面试高频考点宝典已整理好:
👉 点击获取网盘资源(提取码:9b3g)
什么是缓存穿透?危害有多大?
缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层打到数据库。比如恶意请求 -1 或 0 这类非法ID,或者随机生成不存在的主键。这种缓存穿透会造成:
1️⃣ 数据库压力暴增,甚至被打崩
2️⃣ 缓存层完全失效,失去保护作用
3️⃣ 系统响应延迟飙升

解决方案一:布隆过滤器拦截非法请求
这是解决缓存穿透最经典的方案! 面试必考!
- 在缓存层前加布隆过滤器(Bloom Filter)
- 原理:将所有合法数据的key存入布隆过滤器,请求先经过过滤器校验
- 若过滤器判断key不存在 → 直接拦截非法请求
- 优点:内存占用极低(亿级数据仅需百MB)
- 缺点:存在误判率(可通过调整参数降低)
💡 面试话术:
"遇到缓存穿透问题,我会优先采用布隆过滤器方案。比如在Redis前部署Guava BloomFilter,对请求key做预检,拦截掉90%以上的非法穿透请求"
解决方案二:缓存空对象(Null Object)
适合应对随机穿透攻击
- 当查询DB发现数据不存在时 → 在缓存写入空值(如
key: null) - 设置较短过期时间(如5分钟),避免占用过多内存
- 后续相同请求命中空缓存 → 直接返回空结果
// 伪代码示例
Object data = cache.get(key);
if (data == null) {
data = db.query(key);
if (data == null) {
// 缓存空值并设置过期时间
cache.set(key, "NULL", 5 * 60);
}
}
解决方案三:接口限流与熔断
防护恶意请求的最后防线
1️⃣ 对高频请求IP进行限流(如Guava RateLimiter)
2️⃣ 对不存在key的请求计数,超过阈值触发熔断
3️⃣ Nginx层设置黑名单拦截异常IP
⚠️ 注意:此方案需配合前两种使用,单独限流无法根治缓存穿透
面试加分的组合拳策略
在实际高并发系统中,我会采用三级防护:
- 第一层:布隆过滤器拦截非法Key(命中率99%)
- 第二层:缓存空对象应对穿透漏网请求
- 第三层:网关层限流熔断保底

最后的小福利
如果你正在准备Java面试,强烈推荐开通面试鸭会员!覆盖2000+大厂真题和解析,现在通过 面试鸭返利网 下单可返利25元!扫码立即领取优惠👇

📌 本文解决方案已实战验证:
- 某电商平台拦截了每秒10W+的缓存穿透攻击
- 数据库负载下降90%
更多面试干货 → 面试鸭返利网


