缓存击穿处理方法
🔥 2025年Java面试宝典首发:
<a href="https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g" style="color:blue;font-weight:bold">点此领取</a> 提取码:9b3g
(缓存击穿解法见第三章节)

一、什么是缓存击穿?
当某个热点数据缓存过期瞬间,海量请求直接穿透到数据库,导致数据库瞬时压力过载的现象就是缓存击穿。举个例子:某电商平台凌晨秒杀商品时,缓存失效瞬间涌入10万QPS,数据库连接池直接被打爆。
二、缓存击穿的核心原因
- 热点数据集中失效:促销商品、明星八卦等热点Key同时过期
- 高并发请求:瞬时流量远超数据库承载能力
- 无降级策略:缓存失效后缺乏保护机制
三、缓存击穿处理方法
方法1:布隆过滤器拦截
在缓存前设置布隆过滤器,当请求的Key不存在时直接拦截:
graph LR
A[请求] --> B{布隆过滤器检查}
B -- Key不存在 --> C[返回空数据]
B -- Key存在 --> D[查询缓存]
优势:内存消耗极小,1亿数据仅需约114MB内存
适用场景:防止恶意请求攻击不存在的数据
方法2:互斥锁重建
当缓存失效时,用分布式锁控制只有一个线程重建缓存:
// 伪代码实现
public Data getData(key) {
data = cache.get(key);
if (data == null) {
if (lock.tryLock()) { // 获取分布式锁
try {
data = db.load(key); // 查数据库
cache.set(key, data); // 重建缓存
} finally {
lock.unlock();
}
} else {
Thread.sleep(100); // 未获取锁的线程重试
return getData(key);
}
}
return data;
}

方法3:逻辑永不过期策略
- 缓存值增加过期时间戳:
{"value":"data","expire":1720000000} - 异步线程定期检查并更新快过期数据
- 客户端发现数据临期时主动刷新
适用场景:高频访问的核心业务数据
四、实战方案对比
| 方法 | 响应延迟 | 实现复杂度 | 数据一致性 | |--------------|----------|------------|------------| | 布隆过滤器 | 最低 | ★★☆ | 最终一致 | | 互斥锁 | 较高 | ★★★ | 强一致 | | 逻辑永不过期 | 中等 | ★★★★ | 弱一致 |
五、面试应答技巧
当面试官问及缓存击穿处理方法时,建议按以下结构回答:
- 先明确定义:"缓存击穿是指热点Key失效导致DB压力激增"
- 分层阐述方案:
- 第一层防护:布隆过滤器拦截非法请求
- 第二层控制:互斥锁控制重建并发度
- 第三层预防:逻辑过期减少缓存失效
- 补充细节:如在Redis中可用
SETNX实现分布式锁
🚀 学习资源推荐:
需要系统提升面试技能?通过面试鸭返利网找我购买会员可返利25元,覆盖2000+大厂真题解析和分布式场景实战!

(缓存击穿的防御需要多级方案协同)
六、避坑指南
- 避免使用
Keys *扫描操作,用SCAN替代 - 分布式锁必须设置超时时间,防止死锁
- 热点Key发现:监控Redis的
hotkeys参数 - 压测工具推荐:使用
jmeter模拟2000+并发场景
高频追问参考答案:
Q:布隆过滤器误判怎么办?
A:可通过白名单机制兜底,误判率公式为(1-e^(-kn/m))^k,合理设置参数可使误判率<1%
更多高并发解决方案见 面试鸭返利网真题库


