温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

缓存击穿一般怎么发生的

发布时间:2026-10-08 05:23:10 来源:亿速云 阅读:106 作者:小樊 栏目:数据库

**缓存击穿(Cache Breakdown)**通常是指:

某个热点 key 在缓存中过期的瞬间,大量并发请求同时打到数据库,导致数据库瞬间压力剧增。


一、缓存击穿是怎么发生的

典型流程如下:

  1. 热点数据被频繁访问(如商品详情、首页配置)
  2. 该数据在缓存(如 Redis)中设置了过期时间
  3. 缓存刚好过期的一瞬间
  4. 大量并发请求同时发现:
    • 缓存中没有数据(miss)
  5. 这些请求同时去查数据库
  6. 数据库短时间承受巨大压力,甚至被打挂

⚠️ 注意:
缓存击穿 不是缓存中没有数据,而是一个热点 key 突然失效 + 高并发。


二、和另外两个概念的区别

很多人容易混淆:

问题 原因 特点
缓存击穿 单个热点 key 失效 瞬时高并发
缓存雪崩 大量 key 同时失效 整体缓存失效
缓存穿透 查不存在的数据 永远不命中

三、常见触发场景

  • 热点商品 / 活动页缓存到期
  • 使用固定过期时间(如 30 分钟整)
  • 秒杀、大促开始瞬间
  • 缓存服务重启但热点未预热

四、常见解决方案

1️⃣ 互斥锁(最常用)

  • 只有一个线程去查 DB,其他等待
  • 实现方式:
    • Redis SETNX
    • 分布式锁
if cache miss:
    if tryLock():
        data = db.query()
        cache.set(data)
        unlock()
    else:
        sleep / retry

✅ 有效防止并发击穿
❌ 有锁竞争成本


2️⃣ 逻辑过期(不真正过期)

  • 缓存不设置 TTL
  • 数据里带 expireTime
  • 异步刷新
{
  "data": "...",
  "expireAt": 1710000000
}

✅ 无突发请求
❌ 实现稍复杂


3️⃣ 热点 key 不过期

  • 人工 / 脚本管理
  • 配合后台定时刷新

✅ 简单
❌ 不适合所有业务


4️⃣ 请求合并(合并回源)

  • 将短时间内的相同请求合并成一个 DB 请求

5️⃣ 提前预热 + 随机过期

  • 避免同一时刻大量 key 失效

五、一句话总结

缓存击穿 = 热点 key 过期 + 高并发 + 无保护机制

如果你愿意,我也可以:

  • 用 Redis + Java / Go 给一个完整示例
  • 或结合你当前系统讲具体防御方案
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手