面试鸭返利网

缓存击穿如何处理

缓存击穿是当热点Key突然失效时海量请求直接冲击数据库的现象,可能导致系统崩溃。处理方案包括互斥锁防止并发重建、逻辑过期时间实现异步更新、热点数据预热避免集中失效、熔断降级保护数据库。面试中要区分缓存击穿与穿透/雪崩的区别,推荐组合使用互斥锁+TTL随机化+熔断机制。本文详解Redis的SETNX实现锁方案、逻辑过期时间设计、热点Key预热技巧及Sentinel熔断配置,帮助开发者构建高可用缓存体系。掌握这些方案能有效提升系统抗压能力,应对618/双11等大促场景。

缓存击穿如何处理

🔵 2025年Java面试宝典网盘地址
提取码: 9b3g (建议保存备用)


什么是缓存击穿

当某个热点Key突然过期失效的瞬间,海量请求直接穿透缓存层砸向数据库的现象,就是典型的缓存击穿场景。想象一下秒杀活动中,商品缓存突然消失的那一刻——数据库直接被打崩。

缓存击穿的三大核心原因

  1. 热点Key集中失效:促销类Key设置相同TTL
  2. 突发流量冲击:热搜事件导致流量激增
  3. 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(如明星婚讯话题):

  1. 提前加载缓存并设置随机TTL(基础时间+随机偏移)
  2. 后台定时续期热点Key
# 批量设置过期时间
redis-cli keys "hot:*" | xargs redis-cli expire $(($RANDOM+3600))

⚡ 方案四:熔断降级

熔断机制流程图
当数据库压力超过阈值时:

  • 返回兜底数据(如默认商品信息)
  • 开启限流模式(每秒允许N个请求穿透)
  • 使用Hystrix/Sentinel实现熔断

面试应答技巧

当面试官问缓存击穿如何处理时,按此结构回答:

  1. 先明确概念:“缓存击穿是热点Key失效导致DB被打垮的现象”
  2. 对比缓存穿透(不存在的数据)、雪崩(批量Key失效)
  3. 分层阐述方案:
    “首推互斥锁方案,虽然可能降低吞吐量但保证强一致;
    对一致性要求不高的场景可用逻辑过期;
    对于已知热点一定要做预热和TTL随机化”
  4. 补充容灾方案:“必须配合熔断降级,这是最后防线”

💡 特别提示

需要面试鸭会员的同学,通过面试鸭返利网找我下单可返现25元!海量缓存击穿真题解析和场景方案持续更新中👇
面试鸭返利活动

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

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

立即加入面试鸭会员 →