什么是缓存雪崩,什么是缓存穿透,什么是缓存击穿,如何解决 ?

news2025/1/13 15:37:20

目录

1. 什么是缓存雪崩?如何解决 ?

2. 什么是缓存穿透?如何解决 ?

 3. 什么是缓存击穿?如何解决 ?


1. 什么是缓存雪崩?如何解决 ?

        缓存雪崩是指在短时间内,有大量的缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成巨大的压力,严重的情况可能会导致数据库宕机,这个就是缓存雪崩。

未发生雪崩之前的执行流程:

缓存雪崩的执行流程:

 

解决缓存雪崩的三种常见方案:

① 加锁排队(效率低)

加锁可以起到缓冲的作用,但是大大影响了效率,降低了系吞吐量,牺牲了部分用户的体验。

伪代码 >>

// 内存查到数据,直接返回
if(....) {
    return ...;
} else {
    // 排队查询数据库 // 也可以使用 semaphore 信号量
    synchronized (myList) {
        data = jedis.get(myList);
        if(!StringUtils.isNotBlank(data)) { // 双重校验
            // 查数据库
            data = getMyList();
            // 放入缓存
            jedis.set(myList, data);
        }
        return data;
    }
}

② 随机化过期时间(主流)

        为了避免大量缓存同时过期,可以在设置缓存时,添加随机时间,这样就可以避免大量缓存同时失效了,而且这个缓存的跨度要大。

jedis.setex(cachekey, exTime+random.nextInt(1000), value);

③ 设计二级缓存 (成本高)

        二级缓存指的是除了 Redis 缓存之外,再设置一个二级缓存,这个二级缓存的过期时间比 Redis 中要大一点。当 Redis 失效后,先查二级缓存,如果查到数据了,Redis 下次就会从二级缓存中同步数据。

        但是设计二级缓存要多写额外的代码,并且会增加系统的复杂性。查询的时候,走二级缓存没有问题,但是应用程序执行写入操作的时候,那么原本只需要保证 Redis 里的数据和 DB 里的数据一致即可,现在要多保证一个二级缓存的一致性,数据的一致性更难保证了。

2. 什么是缓存穿透?如何解决 ?

        缓存穿透是指查询缓存和数据库都无数据,并且数据库查询无数据的时候,出于容错考虑,数据库不会将无数据的结果保存到缓存中,所以每次请求都会查询数据库,这个就叫缓存穿透。

缓存穿透的执行流程:(Redis 和 数据库都被穿透)

解决缓存穿透的两种常见方案:

① 使用布隆过滤器(成本高)

        可以在缓存和数据库之间,搞一个布隆过滤器,缓存查询不结果的时候,查询布隆过滤器,如果布隆过滤器对于这个查询是没有结果的,就不会走数数据库了,直接返回一个无结果就行了,这样虽然可以解决缓存穿透问题,但是成本太高了。

② 缓存空结果(主流)

        每次查询数据库,不管有没有结果,都把数据缓存到 Redis 里面,下一次查询的时候,就不会再访问数据库了。为了防止长时间内查询不到任何信息,可以将空结果的缓存时间设置的短一些。(例如 3~5 分钟)

 

 3. 什么是缓存击穿?如何解决 ?

        缓存击穿是指某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求需要访问这个热点数据,此时这些请求将会给数据库造成巨大的压力,这个就叫缓存击穿。

缓存击穿的执行流程:(Redis 被击穿)

 解决缓存穿透的两种常见方案:

① 加锁排队(效率低)

        这种方式和缓存雪崩加锁排队类似,都是在查询数据库的时候加锁排队,缓冲访问数据的请求,减少给服务器带来的压力。

② 设置永不过期(主流)

        对于某些热点数据,主流的做法是设置永不过期,这样就能保证缓存的稳定性,就不会出现缓存击穿的问题了。(如果数据库修改了热点数据,也是要记得及时同步更新的)

【总结】缓存雪崩、缓存穿透以及缓存击穿三者定义上的区别:

  • 缓存穿透是因为没有缓存数据导致的问题,
  • 缓存击穿是因为某个热点缓存失效而导致的问题,
  • 缓存雪崩是因为同时有大量的缓存失效所带来的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D姿态相关的损失函数

loss_mpjpe: 计算预测3D关键点与真值之间的平均距离误差(MPJPE)。 loss_n_mpjpe: 计算去除尺度后预测3D关键点误差(N-MPJPE),评估结构误差。 loss_velocity: 计算3D关键点的速度/移动的误差,评估运动的平滑程度。 loss_limb_var: 计算肢体长度的方差,引导生成合理的肢体长度…

SpeedBI数据可视化工具:丰富图表,提高报表易读性

数据可视化工具一大作用就是能把复杂数据可视化、直观化,更容易看懂,也就更容易实现以数据驱动业务管理升级,因此一般的数据可视化工具都会提供大量图形化的数据可视化图表,以提高报表的易懂性,更好地服务企业运营决策…

AUTBUS全球首发,东土与您相约工博会

2023年中国国际工业博览会将于9月19日至9月23日在上海盛大举办。作为工博会重点参展企业之一,东土科技将重磅亮相6.1号馆工业自动化展(展位号:6.1H-D137)。 值得一提的是,AUTBUS 国际标准作为全球第一个基于时间敏感网…

微信开发之一键修改群公告的技术实现

简要描述: 设置群公告 请求URL: http://域名地址/setChatRoomAnnouncement 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必…

新华三重磅发布新一代智慧存储新品

8月22日,紫光股份旗下新华三集团以“重构 进化 启新境”为主题,成功举办新一代智慧存储新品发布会,重磅发布H3C/HPE Alletra MP全局解耦NVMe智能全闪存储、H3C UniStor X10000 G6系列分布式融合存储,基于全新技术架构打造强劲性能…

low-ui-vue前置解读|实现一个动态列的表格组件

最近另一个团队正式在项目中推广内部开发的low-ui组件库了,当然 还在内部阶段,但是太慢了。作为架子的设计者和部分功能的开发者,我决定先把常见的功能通过模仿的形式公开出来。避免大家搜索无果或者使用一些框架增加学习成本。 所谓动态列的…

剑指 Offer 40. 最小的k个数(C++实现)

剑指 Offer 40. 最小的k个数https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/ 法1&#xff1a;二叉堆 通过最小堆&#xff0c;直接筛选出最小的k个数 vector<int> getLeastNumbers(vector<int>& arr, int k) {priority_queue<int, vector<int>…

在Eclipse中创建javaweb工程

新建动态web工程 点击project或other之后&#xff0c;如何快速找到Dynamic Web Project 填写工程名等详细信息 也许会出现下面的对话框 项目结构图

2023第四届中国白茶始祖文化节在世界白茶发源地福鼎举办

天下白茶&#xff0c; 源于太姥。农历七月初七&#xff0c;是中国白茶始祖太姥娘娘羽化成仙的纪念日&#xff0c;8月22日上午由福鼎市茶业协会、福鼎市中国白茶始祖太姥文化研究会指导&#xff0c;由福鼎市太姥山茶业商会主办&#xff0c;由福建省天湖茶业有限公司、福建品品香…

【日常积累】Linux中vi/vim的使用

概述 vim是由vi发展演变过来的文本编辑器&#xff0c;因其具有语法高亮显示、多视窗编辑、代码折叠、支持插件等功能&#xff0c;由于其功能相比vi来说更加强大&#xff0c;所以在实际工作中的使用更加广泛。 vim工作模式 Vim具有多种工作模式&#xff0c;常用的工作模式有&…

基于swing的校园茶餐厅java jsp点餐订餐管理mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的校园茶餐厅 系统有1权限 二、主要功能 …

Spring 自动装配机制详解

文章目录 一、手动装配二、自动装配1. XML 方式2. 注解方式 一、手动装配 首先知道 Spring 装配是干了件啥事&#xff1f;我的理解&#xff0c;它就是用来解决 bean 之间依赖关系的一个手段。 比如说我这里有一个 People 类和一个 Dog 类&#xff0c;People 依赖 Dog&#xff…

uniapp - 实现卡片式胶囊单选后右上角出现 “√“ 对勾对号选中效果功能,适用于小程序h5网页app全平台通用(一键复制组件源码,开箱即用!)

效果图 uniapp全平台兼容(小程序/h5网页/app)实现点击选择后,右上角出现 √ 对号效果(角标形式展现),功能组件, 改个样式,直接复制使用该组件。 组件源码 在 components 组件文件夹下,随便建立一个 .vue 文件,一键复制下方源码。

ModaHub魔搭社区:AI Agent在网络购物场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

发力服务业务,龙湖集团半程领跑赢在“智慧”

成立三十载&#xff0c;龙湖集团一直是房地产行业“特立独行”的存在。 一方面&#xff0c;龙湖在对外战略方面长期量入为出&#xff0c;从不背上过重的“包袱”。 不久前&#xff0c;一则消息引发市场关注&#xff1a;龙湖集团提前偿还17亿元债务&#xff0c;已基本全部还清…

solidity0.8.0的应用案例12:通用可升级合约UUPS

代理合约中选择器冲突(Selector Clash)的另一个解决办法:通用可升级代理(UUPS,universal upgradeable proxy standard)。代码由OpenZeppelin的UUPSUpgradeable简化而成,不应用于生产。 UUPS 作为透明代理的替代方案,UUPS也能解决"选择器冲突"(Selector Cl…

ARM开发(cortex-A7核中断实验)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …

特征值分解、SVD分解在线性最小二乘解上的应用

1. 奇异值分解(SVD)原理 1.1 回顾特征值和特征向量 我们首先回顾下特征值和特征向量的定义如下&#xff1a; A x λ x Axλx Axλx其中A是一个nn的实对称矩阵&#xff0c;x是一个n维向量&#xff0c;则我们说λ是矩阵A的一个特征值&#xff0c;而x是矩阵A的特征值λ所对应的…

数据之美:探索数据可视化设计的奇妙世界

在信息时代的浪潮中&#xff0c;海量的数据正在影响着我们的生活和决策。然而&#xff0c;数据本身虽然有力量&#xff0c;但如何将其有机地呈现给我们&#xff0c;却成为了一个挑战。数据可视化设计应运而生&#xff0c;它不仅让枯燥的数字变得生动&#xff0c;还带来了一场视…

修复磁盘错误需要一小时才能完成怎么办?

“修复磁盘错误需要一小时才能完成”是一种常见的问题&#xff0c;当你遇到这个问题&#xff0c;又不想长时间等待时&#xff0c;可以尝试一下方式进行解决。 方法1. 在安全模式中解决 1. 在启动电脑看到Windows标志时&#xff0c;长按电源键强行关机&#xff0c;重复此操作三…