redis缓存雪崩和缓存击穿

目录

 缓存雪崩

解决方案:

缓存击穿

​解决方案


 缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

u 给不同的 Key TTL 添加随机值
u 利用 Redis 集群提高服务的可用性
u 给缓存业务添加降级限流策略
u 给业务添加多级缓存

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案

        1.互斥锁

        2.逻辑过期

互斥锁和逻辑回归的优缺点 

互斥锁:

        优点:

没有额外的内存消耗
保证一致性
实现简单

         缺点:

线程需要等待,性能受影响
可能有死锁风险

逻辑回归:

        优点:

线程无需等待,性能较好

         缺点:

不保证一致性
有额外内存消耗
实现复杂

 使用互斥锁的形式解决缓存击穿

 public Shop queryWithMutex(Long id) throws InterruptedException {String key = CACHE_SHOP_KEY + id;//1.从redis中查询店铺缓存String jsonShop = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if (StrUtil.isNotBlank(jsonShop)) {//3.存在,直接返回return JSONUtil.toBean(jsonShop, Shop.class);}if ("".equals(jsonShop)) {return null;}//4.不存在,重建缓存//4.1  获取互斥锁//shop为实体类Shop shop = null;try {Boolean isLock = tryLock(LOCK_SHOP_KEY + id);//4.2 判断是否获取成功if (!isLock) {//4.3 失败,则休眠并重试Thread.sleep(50);return queryWithPassThrough(id);}//4.4 成功,根据id查询数据库shop = getById(id);//5. 不存在 返回错误if (shop == null) {// 将空值放入redisstringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}// 6. 存在 写入 redisstringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {//7.释放互斥锁unLock(LOCK_SHOP_KEY + id);}//8.返回return shop;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/54495.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【黑马头条之kafka及异步通知文章上下架】

本笔记内容为黑马头条项目的kafka及异步通知文章上下架部分 目录 一、kafka概述 二、kafka安装配置 三、kafka入门 四、kafka高可用设计 1、集群 2、备份机制(Replication) 五、kafka生产者详解 1、发送类型 2、参数详解 六、kafka消费者详解 1、消费者…

C++派生类的构造函数

1.构造函数 定义了派生类之后,要使用派生类就需要声明该类的对象。对象在使用之前必须初始化。 派生类的成员对象是由所有基类的成员对象共同组成的。因此构造派生类函数的对象时,就要对基类的成员对象和新增的成员对象进行初始化。 基类的构造函数并…

Linux CentOS系统怎么下载软件

Linux CenOS系统想要下载软件可以在Linux内置的应用商店,并通过Yum 包管理器来下载(直接使用yum命令下载软件) 在Linux系统中,Yum(Yellowdog Updater, Modified)是用于管理RPM软件包的一个包管理器。 安装…

ChatGPT-4.0:你准备好了吗?

3202年了,你还在用ChatGPT 3.5吗? 来感受一下ChatGPT 4.0的魅力吧 文末附升级链接 1、颠倒黑白? 2、解读幽默? 3、小镇做题家? 如何白嫖? 最后 1、科技的发展加快了知识更新的速度,唯有终身…

数据库操作系列-Mysql, Postgres常用sql语句总结

文章目录 1.如果我想要写一句sql语句,实现 如果存在则更新,否则就插入新数据,如何解决?MySQL数据库实现方案: ON DUPLICATE KEY UPDATE写法 Postgres数据库实现方案:方案1:方案2:关于更新:如何实…

前端实现打印1 - 使用 iframe 实现 并 分页打印

目录 打印代码对话框预览打印预览 打印代码 <!-- 打印 --> <template><el-dialogtitle"打印":visible.sync"dialogVisible"width"50%"top"7vh"append-to-bodyclose"handleClose"><div ref"print…

大数据与okcc呼叫中心融合的几种方式

在实际的生产实践中&#xff0c;为提高营销效率&#xff0c;避免骚扰大众&#xff0c;很多呼叫中心业务会与大数据平台进行合作&#xff0c;进行精准营销。 买卖数据是非法的&#xff0c;大数据平台方并不会提供直接的数据&#xff0c;一般情况下&#xff0c;提供的数据都是脱…

C#利用自定义特性以及反射,来提大型项目的开发的效率

在大型项目的开发过程中&#xff0c;需要多人协同工作&#xff0c;来加速项目完成进度。 比如一个软件有100个form&#xff0c;分给100个人来写&#xff0c;每个人完成自己的Form.cs的编写之后&#xff0c;要在Mainform调用自己写的Form。 如果按照正常的Form form1 new For…

【数据分析入门】人工智能、数据分析和深度学习是什么关系?如何快速入门 Python Pandas?

目录 一、前言二、数据分析和深度学习的区别三、人工智能四、深度学习五、Pandas六、Pandas数据结构6.1 Series - 序列6.2 DataFrame - 数据框 七、输入、输出7.1 读取/写入CSV7.2 读取/写入Excel7.3 读取和写入 SQL 查询及数据库表 八、调用帮助九、选择(这里可以参考上一篇文…

【动态规划刷题 5】 最小路径和地下城游戏

最小路径和 链接: 64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输…

Qt--QPlugin插件

写在前面 Qt–动态链接库一文中提到&#xff0c;动态方式加载dll只能加载 extern "C“ 的导出函数&#xff0c;而无法加载类&#xff0c;因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分&#xff0c;是一种轻量级的插件系统&#xff0c;…

数据集的介绍及其标注

水到绝境是风景 人到绝境是重生 一、什么是目标检测 目标检测是计算机视觉领域的一个重要任务&#xff0c;旨在识别和定位图像或视频中的多个目标对象。与图像分类只关注图像属于哪个类别不同&#xff0c;目标检测不仅要确定目标所属的类别&#xff0c;还要准确地标记目标在图…