温馨提示×

温馨提示×

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

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

什么导致Cache缓存击穿

发布时间:2026-09-18 21:40:02 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

**缓存击穿(Cache Penetration / 更常见叫“缓存击穿”指 Hot Key 失效)**通常是指:

某个热点 key 在缓存中突然失效(或过期),同时有大量并发请求访问该 key,导致请求直接打到数据库,造成数据库瞬时压力剧增。


一、导致缓存击穿的主要原因

1. 热点 Key 过期

  • 某个被高频访问的 key(如首页商品、热搜词)
  • 设置了 TTL(过期时间)
  • 在过期瞬间,大量请求同时到达

✅ 结果:缓存未命中 → 全部查数据库


2. 缓存集中失效

  • 大量 key 在同一时间设置相同过期时间
  • 例如:批量加载缓存时统一设 30 分钟

✅ 结果:某一时刻缓存“集体消失”


3. 缓存服务异常或重启

  • Redis 宕机
  • 主动清缓存(如发布版本 flush)
  • 热点数据未做持久化

4. 并发重建缓存逻辑不合理

常见问题代码逻辑:

if cache == null:
    data = db.query()
    cache.set(data)

❌ 问题:

  • 100 个线程同时发现 cache == null
  • 100 个线程同时查数据库

二、缓存击穿 vs 缓存穿透 vs 缓存雪崩

类型 原因 特点
击穿 热点 key 失效 单 key 高并发
穿透 查询不存在的数据 故意或异常请求
雪崩 大量 key 同时失效 系统性崩溃

三、常见解决方案

✅ 1. 互斥锁(Mutex / 分布式锁)

if cache == null:
    if tryLock():
        data = db.query()
        cache.set(data)
        unlock()
    else:
        sleep + retry

✅ 2. 逻辑过期(不真过期)

  • 缓存永不过期
  • value 中带 expire 字段
  • 后台异步刷新

✅ 3. 热点 Key 永不过期

  • 对极热数据不设置 TTL
  • 主动更新代替自动失效

✅ 4. 随机过期时间

expire = 30min + random(0~5min)

✅ 5. 请求合并(如 Bloom Filter / 合并查询)


四、一句话总结

缓存击穿的本质是:热点数据失效 + 高并发 + 无保护地回源数据库。

如果你愿意,我也可以结合 Redis / Java / Go / 高并发架构 给你具体代码示例。

向AI问一下细节

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

AI
助
手