温馨提示×

温馨提示×

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

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

怎样避免Cache缓存雪崩

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

缓存雪崩(Cache Avalanche)通常是指:大量缓存数据在同一时间集中失效(或缓存服务整体宕机),导致瞬间大量请求直接打到数据库,造成数据库压力激增甚至崩溃。

下面从原因 → 应对方案 → 实践建议三个层面说明如何避免。


一、常见原因

  1. 缓存 key 设置了相同的过期时间
  2. 缓存服务(如 Redis)宕机或重启
  3. 突发流量 + 缓存失效叠加
  4. 热点数据集中失效

二、核心解决方案

1️⃣ 过期时间加随机值(最基础)

避免同时失效:

实际过期时间 = 基础时间 + 随机时间

示例(伪代码):

int expire = 3600 + Random.nextInt(300); // 1小时±5分钟
redis.set(key, value, expire);

✅ 适用:绝大多数业务场景


2️⃣ 热点数据“逻辑过期 / 永不过期”

  • 物理不过期:Redis 不设置 expire
  • 逻辑过期:在 value 中存 expireTime

流程:

  1. 读到数据
  2. 判断是否逻辑过期
  3. 过期则异步更新缓存

✅ 适合:极高并发热点数据(如首页、商品详情)


3️⃣ 缓存预热(提前加载)

在:

  • 系统启动
  • 大促前
  • 低峰期

提前把热点数据写入缓存。


4️⃣ 多级缓存

减少单点依赖:

本地缓存(Caffeine/Guava) → Redis → DB

即使 Redis 挂:

  • 本地缓存仍可扛一部分流量

5️⃣ 限流 & 降级

  • 接口限流(令牌桶 / 滑动窗口)
  • 降级返回:
    • 默认数据
    • 静态页
    • 空结果

防止数据库被冲垮。


6️⃣ 缓存重建互斥(防止击穿叠加)

当缓存失效时:

  • 只让 一个线程 去查 DB
  • 其他线程等待或返回旧值

示例思路:

if cache missing:
    if tryLock(key):
        load DB
        set cache
    else:
        sleep & retry

✅ 防止“雪崩前的缓存击穿”


7️⃣ Redis 高可用

  • 主从 + 哨兵
  • Redis Cluster
  • 多机房部署

避免 缓存整体不可用。


三、典型组合方案(推荐)

场景 推荐方案
普通业务 随机过期 + 限流
热点数据 逻辑过期 + 互斥重建
大促 预热 + 多级缓存 + 降级
核心系统 Redis 集群 + 本地缓存

四、一句话总结

避免缓存雪崩 = 不让缓存“集体消失” + 不让数据库“裸奔”

如果你有具体技术栈(如 Redis + Spring Boot / 高并发电商),我可以给你一套可直接用的代码模板。

向AI问一下细节

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

AI
助
手