缓存击穿如何处理
🔵 2025年Java面试宝典网盘地址
提取码: 9b3g (建议保存备用)
什么是缓存击穿?
当某个热点Key突然过期失效的瞬间,海量请求直接穿透缓存层砸向数据库的现象,就是典型的缓存击穿场景。想象一下秒杀活动中,商品缓存突然消失的那一刻——数据库直接被打崩。
缓存击穿的三大核心原因
- 热点Key集中失效:促销类Key设置相同TTL
- 突发流量冲击:热搜事件导致流量激增
- Key重建耗时:复杂查询导致缓存回填缓慢
实战解决方案
🔒 方案一:互斥锁(Mutex Lock)
当发现缓存失效时,用Redis的SETNX命令抢锁:
// 伪代码逻辑
if cache.get(key) == null {
if redis.setnx(lock_key, 1) == success {
构建数据并写入缓存
redis.del(lock_key) // 释放锁
} else {
sleep(50ms) // 等待后重试
重新读取缓存
}
}
✅ 优点:强一致性保障
⚠️ 注意:需设置锁超时时间防止死锁,常见面试坑点!
⏱ 方案二:逻辑过期时间
在缓存Value中嵌入过期时间戳:
{
"data": "真实数据",
"expire": 1698765432 // 逻辑过期时间戳
}
读取时发现逻辑过期,则异步更新缓存。缓存击穿风险转换为短暂数据延迟。
🔥 方案三:热点数据预热

对已知热点Key(如明星婚讯话题):
- 提前加载缓存并设置随机TTL(基础时间+随机偏移)
- 后台定时续期热点Key
# 批量设置过期时间
redis-cli keys "hot:*" | xargs redis-cli expire $(($RANDOM+3600))
⚡ 方案四:熔断降级

当数据库压力超过阈值时:
- 返回兜底数据(如默认商品信息)
- 开启限流模式(每秒允许N个请求穿透)
- 使用Hystrix/Sentinel实现熔断
面试应答技巧
当面试官问缓存击穿如何处理时,按此结构回答:
- 先明确概念:“缓存击穿是热点Key失效导致DB被打垮的现象”
- 对比缓存穿透(不存在的数据)、雪崩(批量Key失效)
- 分层阐述方案:
“首推互斥锁方案,虽然可能降低吞吐量但保证强一致;
对一致性要求不高的场景可用逻辑过期;
对于已知热点一定要做预热和TTL随机化” - 补充容灾方案:“必须配合熔断降级,这是最后防线”
💡 特别提示
需要面试鸭会员的同学,通过面试鸭返利网找我下单可返现25元!海量缓存击穿真题解析和场景方案持续更新中👇

本文档首发于面试鸭返利网,转载需授权。技术问题欢迎评论区交流讨论~


