温馨提示×

温馨提示×

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

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

redis缓存击穿怎么办

发布时间:2026-10-18 08:59:12 来源:亿速云 阅读:97 作者:小樊 栏目:关系型数据库

**缓存击穿(Cache Breakdown)**是指:某个热点 key 在缓存中过期的瞬间,大量并发请求同时打到数据库,造成数据库瞬时压力剧增。

下面从原因 → 解决方案 → 实战建议来说。


一、问题本质

  • 热点 key(如首页商品、活动配置)
  • 缓存刚好失效
  • 高并发同时查 DB
  • DB 被打崩

⚠️ 注意区分:

  • 缓存击穿:单个热点 key 失效
  • 缓存雪崩:大量 key 同时失效
  • 缓存穿透:查不存在的数据

二、常见解决方案(重点)

✅ 方案 1:互斥锁(最常用)

思路:只有一个线程去查 DB,其他线程等待。

Redis + 分布式锁

String value = redis.get(key);
if (value == null) {
    if (redis.setnx(lockKey, "1", 3)) { // 获取锁
        value = db.query();
        redis.set(key, value, expire);
        redis.del(lockKey);
    } else {
        Thread.sleep(50);
        return getFromCache(key); // 重试
    }
}

✅ 优点:简单有效
❌ 缺点:有锁竞争,实现稍复杂


✅ 方案 2:逻辑过期(推荐)

思路:Redis 不设置真实过期时间,业务自己判断过期。

{
  "value": "真实数据",
  "expire": 1700000000
}
if (now > expire) {
    if (tryLock()) {
        asyncRefresh();
    }
}
return value;

✅ 优点:

  • 不会集中失效
  • 性能好

❌ 缺点:

  • 短期可能返回旧数据

✅ 方案 3:热点 key 永不过期

  • 热点数据不设置 TTL
  • 后台定时任务更新

✅ 适合:

  • 配置类
  • 活动页

✅ 方案 4:请求合并(高级)

  • 将短时间内的相同请求合并成一个 DB 查询
  • 如 Hystrix / Sentinel / 自研队列

✅ 适合超高并发场景


三、防击穿的“组合拳”(推荐)

生产环境常用方案:

  1. 热点 key 永不过期 / 逻辑过期
  2. 加分布式锁兜底
  3. 限流 + 降级
  4. 本地缓存(Caffeine)

四、简单总结

方案 推荐度 说明
互斥锁 ⭐⭐⭐⭐ 最通用
逻辑过期 ⭐⭐⭐⭐⭐ 体验最好
永不过期 ⭐⭐⭐ 简单
请求合并 ⭐⭐⭐⭐ 高性能

如果你愿意,可以告诉我:

  • 使用的语言(Java / Go / PHP)
  • 是否用 Redis Cluster
  • 是否是高并发场景

我可以给你可直接用的代码模板。

向AI问一下细节

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

AI
助
手