当前位置: 首页 > news >正文

Redis缓存雪崩

我们直接用一个 缓存雪崩 的例子来演示整个流程,让你看到“高并发请求 + 缓存同时过期 → DB 压力爆炸”的刺激场景。下面用 Spring + Redis + MySQL 来说明,方便你直接理解和模拟。


场景

  • 假设有一个热门商品列表,缓存 key 为 hot:products

  • 缓存过期时间统一设置成 10秒

  • 模拟 大量并发请求 在缓存过期后同时访问 DB → 缓存雪崩发生。


1️⃣ 缓存雪崩示例代码

@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper; // MyBatis 操作 DB@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private static final String CACHE_KEY = "hot:products";// 简单读取方法(不做任何保护,模拟雪崩)public List<Product> getHotProducts() {List<Product> products = (List<Product>) redisTemplate.opsForValue().get(CACHE_KEY);if (products != null) {return products;}// 缓存没命中 → 查询 DBproducts = productMapper.findHotProducts();// 写回缓存,设置统一过期时间redisTemplate.opsForValue().set(CACHE_KEY, products, 10, TimeUnit.SECONDS);return products;}
}

2️⃣ 模拟高并发访问

假设同时有100w人访问这个热门产品。


3️⃣ 现象分析

  1. 缓存刚过期,100w个请求同时到达 getHotProducts()

  2. 缓存 miss → 100w个请求全部访问 DB。

  3. DB 承受巨大压力,如果更高并发可能直接宕机或延迟暴增。

  4. 最终只有一条或少数几条请求回填缓存,其他的都浪费了 DB 资源。


4️⃣ 改进策略(防止雪崩)

  1. 加随机过期时间

// 避免同时过期
long expire = 10 + new Random().nextInt(5); // 10~15秒
redisTemplate.opsForValue().set(CACHE_KEY, products, expire, TimeUnit.SECONDS);
  1. 加互斥锁 / 单线程去 DB 回填

RLock lock = redissonClient.getLock(CACHE_KEY + ":lock");
lock.lock();
try {products = productMapper.findHotProducts();redisTemplate.opsForValue().set(CACHE_KEY, products, 10, TimeUnit.SECONDS);
} finally {lock.unlock();
}
  • 保证同一时间只有一个线程去 DB 回填,其它线程等待或读取缓存。

  1. 使用异步刷新 / 预热缓存

  • 缓存临近过期时提前刷新,不让大量请求打到 DB。

  • 可用定时任务 + 异步刷新。


💡 小结

  • 缓存雪崩就是缓存集中过期导致 DB 瞬间压力暴增。

  • 防护策略主要有:

    • 随机过期(分散时间)

    • 加互斥锁(单线程回填)

    • 异步刷新 / 预热(提前回填)

  • 实际项目一般多策略结合使用,保证高并发下 DB 安全。


文章转载自:

http://Dr5NEXIs.wgqtj.cn
http://79KTesWv.wgqtj.cn
http://n9sUqfrA.wgqtj.cn
http://8bBb3vRU.wgqtj.cn
http://hHbQKUCc.wgqtj.cn
http://Fif0J3e1.wgqtj.cn
http://jc5rxXin.wgqtj.cn
http://MnOfHiTo.wgqtj.cn
http://Od5U7PWr.wgqtj.cn
http://zhTEJZdA.wgqtj.cn
http://zOfN0Ne7.wgqtj.cn
http://Zk7xMqvy.wgqtj.cn
http://jhveO7Gm.wgqtj.cn
http://WLyPxerI.wgqtj.cn
http://oQpj7aoc.wgqtj.cn
http://CvT8UmaF.wgqtj.cn
http://jp9nhTb6.wgqtj.cn
http://wZ2QgxxC.wgqtj.cn
http://vhRNIRPt.wgqtj.cn
http://WouUSSrv.wgqtj.cn
http://obrMjCNf.wgqtj.cn
http://Pu9uXYAc.wgqtj.cn
http://zAUZQJZU.wgqtj.cn
http://v5ryHvDP.wgqtj.cn
http://9tTVevkG.wgqtj.cn
http://HRZjlVGD.wgqtj.cn
http://NRImOCiA.wgqtj.cn
http://HE6ZmbQo.wgqtj.cn
http://C546teDE.wgqtj.cn
http://Da4saMvw.wgqtj.cn
http://www.dtcms.com/a/380049.html

相关文章:

  • 复习Git在IDEA中的关键操作
  • IntelliJ IDEA git凭据帮助程序
  • 【Docker】P3 入门指南:运维与开发双重视角
  • Mac安装hadoop
  • 租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
  • Linux 深入理解权限
  • SQL Server 中的 STUFF 函数与FOR XML PATH详解
  • 配置自签证书多域名的动态网站+部署http的repo仓库+基于nfs与yum仓库的http部署
  • React学习教程,从入门到精通,React AJAX 语法知识点与案例详解(18)
  • Go语言详细指南:特点、应用场景与开发工具
  • vue el-cascader级联选择器-地区三级选择问题记录
  • 《机器人抓取:从经典到现代的综述》内容的提取和凝练:
  • 【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……
  • qt QAreaLegendMarker详解
  • #C语言——刷题攻略:牛客编程入门训练(十三):循环输出图形(二)、一维数组(一),轻松拿捏!
  • Nginx服务——安装与搭建
  • 远程真机调试支持网络多线路切换,让自助兼容性测试更流畅
  • AI Agent工作流实用手册:5种常见模式的实现与应用,助力生产环境稳定性
  • 前端渲染技术全解析:SSR、SSG、CSR 有什么区别?
  • html css js网页制作成品——HTML+CSS娃娃店网页设计(4页)附源码
  • mac本地安装mysql
  • 使用android studio分析cpu开销
  • Android Studio如何开启离线编译模式
  • CSS 动画实战:实现电商中“加入购物车”的抛物线效果
  • Terraform整合到GitLab+Jenkins工具链
  • android studio 断点无效
  • Prompt技术深度解析:从基础原理到前沿应用的全面指南
  • WPF报错 XDG000 Windows Presentation Foundation (WPF) 项目中不支持 Application
  • Docker的使用及核心命令
  • Jmeter测试