缓存穿透、缓存击穿、缓存雪崩


一、概念介绍


缓存穿透:

定义:缓存穿透指的是请求查询缓存和数据库中都不存在的数据,从而导致每次请求都直接访问数据库。
原因:通常是由于恶意请求、非法输入或系统漏洞导致的。攻击者故意提交无效的查询,绕过缓存直接访问数据库。
影响:频繁的缓存穿透会导致数据库负载增加,消耗额外的资源,并可能引起拒绝服务(Denial of Service)攻击。


缓存击穿:

定义:缓存击穿指的是一个热点数据失效或被删除后,大量并发请求同时到达系统并请求该数据,导致缓存无法命中而直接访问数据库。
原因:通常是由于热点数据过期、手动删除、大量并发请求或非法请求引起的。
影响:缓存击穿会导致数据库负载剧增,大量请求直接访问数据库,降低了系统性能,甚至可能导致数据库崩溃。


缓存雪崩:

定义:缓存雪崩指的是缓存中大量数据同时失效或缓存系统不可用,导致大量请求直接访问数据库,对数据库造成巨大压力。
原因:通常是由于缓存过期时间集中、缓存依赖关系或缓存系统故障引起的。
影响:缓存雪崩会导致系统性能下降、响应延迟增加甚至系统崩溃,严重影响系统的可用性。
综上所述,缓存穿透是指访问缓存和数据库都不存在的数据,缓存击穿是指热点数据失效导致请求直接访问数据库,而缓存雪崩是指大量缓存数据同时失效或缓存系统不可用,导致大量请求直接访问数据库。这些问题都会对系统性能、可用性和安全性造成负面影响。

二、 缓存击穿


2.1 定义


缓存击穿:缓存击穿是指在使用缓存的场景下,当某个热点数据失效或不存在时,大量并发请求同时访问该数据,导致请求都穿透缓存直接访问后端数据库,造成数据库负载过大。解决方案通常包括加锁、互斥锁、预加载等方法。

2.2  缓存击穿通常发生在以下情况下:


热点数据失效:当某个热点数据的缓存失效,并且有大量请求同时访问该数据时,会导致缓存击穿。

冷启动问题:当系统刚启动或者缓存被清空时,大量请求同时访问未缓存的数据,也会引发缓存击穿。

2.3 缓存击穿解决方案


加锁机制:在请求缓存失效时,只允许一个请求去查询数据库,其他请求等待。当第一个请求完成数据库查询后,将结果回写到缓存中,其他请求再从缓存获取数据。这样可以避免大量请求同时访问数据库。

互斥锁(Mutex):在缓存失效时,利用互斥锁机制阻止并发请求查询数据库。通过在代码层面加锁,保证只有一个线程执行查询操作,其他线程等待并直接从缓存获取数据。

预加载(Cache Pre-warming):在系统启动或空闲期间,预先将热点数据加载到缓存中。这样可以避免冷启动时大量请求直接访问数据库。

设置短暂的缓存过期时间:当缓存失效后,设定较短的过期时间,避免大量请求在同一时间窗口内访问数据库。

响应穿透检测:在缓存层对请求进行合法性检测,如果请求的数据在数据库中不存在,可以将该键对应的缓存值设置为空值或者特殊标记,避免反复查询数据库。

三、 缓存穿透


3.1 定义


缓存穿透:缓存穿透是指查询一个不存在于缓存和数据库中的数据,导致每次请求都必须查询数据库,而且该数据永远不存在于缓存中,从而浪费了大量的数据库资源。缓存穿透可能因为恶意攻击、非法请求或者系统错误等原因引起。解决方案通常包括设置空值缓存、布隆过滤器、热点数据预加载等方法。

3.2 发生场景


恶意请求:攻击者故意发送无效的查询或非法输入,以绕过缓存直接访问数据库。

数据库中不存在的数据:频繁查询缓存和数据库中都不存在的数据。

3.3 解决方案


布隆过滤器(Bloom Filter):使用布隆过滤器来过滤掉那些明显不存在于数据库中的请求。布隆过滤器是一种高效的数据结构,它可以快速判断某个元素是否存在于集合中。

缓存空对象(Cache null objects):当查询数据库后发现数据不存在时,将结果也缓存下来,但设置一个较短的过期时间。这样,在下一次请求相同数据时就可以从缓存中获取结果,而不需要再次访问数据库。

异常请求拦截(Request filtering):对于异常请求或频繁请求的IP地址,可以采取一定的限流或封禁策略,以减轻对数据库的负载。

缓存预热(Cache warming):在系统启动或低峰期,提前将一些热门数据加载到缓存中,避免冷启动时大量请求直接访问数据库。

数据合法性校验:在接收到请求后,进行合法性校验,例如检查参数的有效性、鉴权等,避免非法请求绕过缓存直接访问数据库。

异步加载数据:对于不存在于缓存中的数据,可以通过异步方式加载数据,并将其缓存起来。这样,在下一次请求相同数据时就可以从缓存中获取结果,而不需要再次访问数据库。

四、 缓存雪崩


4.1 定义


缓存雪崩是指在缓存中的大量数据同时失效或者缓存系统不可用导致大量请求直接访问数据库,从而对数据库造成巨大压力。这种情况下,数据库可能会无法承受如此大的并发请求负载,导致系统性能下降甚至崩溃。

4.2 发生场景


缓存过期时间集中:当大量缓存的过期时间设置在相近的时刻,或者由于缓存系统异常导致所有缓存同时失效,会导致大量请求在同一时间窗口内穿透缓存去查询数据库。

缓存依赖关系:如果缓存之间存在依赖关系,并且其中一个缓存失效后,其他缓存也无法得到有效更新,会导致相关依赖的数据请求直接访问数据库。

缓存系统故障:当缓存系统发生故障且无法提供服务时,所有的请求都无法命中缓存,只能直接请求数据库,使得数据库承受巨大的负载压力。

4.3 解决方案


使用多级缓存和热点数据预加载,减少缓存失效的风险。

合理设置缓存过期时间,避免过多缓存同时失效。

设置随机的缓存过期时间,避免大量缓存在同一时间失效。

实施缓存的容灾备份,确保即使一个缓存节点故障,整个系统仍能正常运行。

在关键路径上增加限流措施,避免过多请求同时访问数据库。

五、小栗子


举个例子,就类似于百度这种搜索场景。 如果每天大量的人搜索数据,然后去mysql等这种数据库的磁盘中,查询数据。在磁盘中读取数据,比较慢,会对数据库造成很大压力。

所以 将一些很多人访问的数据(称为热点数据),缓存到redis中。 用户进行搜索的时候,是先去redis 查询数据,如果有数据,则直接返回,如果在redis中查不到数据,然后再去查mysql这种数据库。(这样是比较消耗性能的)

热点数据就是某一段时间内,用户大量访问数据。比如设置某条数据如果十分钟被访问超过5次,则称为热点数据,存在redis中。某条热点数据,在十分钟内被访问没有超过5次,则会被释放掉。

redis缓存穿透:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

先查redis缓存,查不到,再去查存储层 这样是非常消耗性能的。

在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
 

缓存击穿:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

利用缓存击穿攻击:
还是举搜索的例子,redis存的是热点数据。普通用户进行搜索时,先读取redis缓存,如果读不到,才去mysql数据中读。

当别人攻击时,它会利用大量的生僻词去进行搜索,这些数据在redis里没有,会去读取mysql磁盘,消耗大量的性能。 并且使用 这些生僻的词变成热点数据,存贮在redis缓存中。

此时,正常用户,再去访问时,在redis缓存中,存贮的都是生僻的词,查不到他们的数据,则会再次去mysql中查询数据。造成性能的消耗。


 

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

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

相关文章

Angular安全专辑之四 —— 避免服务端可能的资源耗尽(NodeJS)

express-rate-limit是一个简单实用的npm包,用于在Express应用程序中实现速率限制。它可以帮助防止DDoS攻击和暴力破解,同时还允许对API端点进行流控。 express-rate-limit及其主要功能 express-rate-limit是Express框架的一个流行中间件,它允许根据IP地址或其他标准轻松地对请求…

每日后端面试5题 第十天

一、说出Spring的9种设计模式 1.简单工厂 2.工厂方法(Factory Method) 3.单例(Singleton) 4.适配器(Adapter) 5.包装器(Decorator) 6.代理(Proxy) 7.观…

数据仓库环境下的超市进销存系统结构

传统的进销存系统建立的以单一数据库为中心的数据组织模式,已经无 法满足决策分析对数据库系统的要求,而数据仓库技术的出现和发展,为上述问题 的解决提供了强有力的工具和手段。数据仓库是一种对多个分布式的、异构的数据 库提供统一查询…

U盘文件恢复软件推荐,这几款高效恢复数据!

“我真的可以算得上是一个u盘杀手了,好多资料保存在u盘中,但经常都会由于粗心导致u盘中的数据丢失。大家有什么u盘文件恢复软件可以推荐吗?救救我的u盘吧!” 在现代社会,人手一个u盘一点也不夸张。尤其是学生党和打工人…

阿里云架构

负载均衡slb 分类以及应用场景 负载均衡slb clb 传统的负载均衡(原slb) 支持4层和7层(仅支持对uri(location),域名进行转发) 一般使用slb(clb) alb 应用负载均衡 只支持7层,整合了nginx负载均衡的各种功能,可以根据用户请求头,响应头 如果需要详细处理用户请求(浏…

华为数通方向HCIP-DataCom H12-821题库(单选题:141-160)

第141题 Router-LSA 能够描述不同的链路类型,不属于Router LSA 链路类型的是以下哪一项? A、Link Type 可以用来描述到末梢网络的连接,即 SubNet B、Link Type 可以用来描述到中转网络的连接,即 TranNet C、Link Type 可以用来描述到另一…

2023京东口腔护理赛道行业数据分析(京东销售数据分析)

近年来,口腔护理逐渐成为年轻人重视的健康领域,从口腔护理整体市场来看,牙膏和牙刷等基础口腔护理产品仍占据主导地位。不过,随着口腔护理市场逐步朝向精致化、专业化、多元化等方向发展,不少新兴口腔护理产品受到消费…

算法通关村第8关【白银】| 二叉树的深度和高度问题

1.最大深度问题 思路:递归三部曲 第一步:确定参数和返回值 题目要求求二叉树的深度,也就是有多少层,需要传递一个root从底层向上统计 int maxDepth(TreeNode root) 第二步:确定终止条件 当递归到null时就说明到底了…

SpringMVC中Controller层获取前端请求参数的几种方式

SpringMVC中Controller层获取前端请求参数的几种方式 1、SpringMVC自动绑定2、使用RequestParam 注解进行接收3、RequestBody注解(1) 使用实体来接收JSON(2)使用 Map 集合接收JSON(3) 使用 List集合接收JSO…

持续性能优化:确保应用保持高性能

在当今数字化时代,应用程序的性能已经成为用户体验和业务成功的关键因素之一。无论是Web应用、移动应用还是企业级软件,用户对于速度和响应性的要求越来越高。因此,持续性能优化已经成为保证应用在竞争激烈的市场中脱颖而出的重要策略。 什么…

事务方法中保证数据只插入一次方案探究

需求场景 在项目的接口请求中,我们有一个接口A需要事务支持,在接口A中调用了方法B,方法B也需要事务支持,两者都带有Transactional注解。在B方法中是这个一个逻辑,查询本地数据库是否包含属性值为一个特定值的字段&…

线性代数的学习和整理15:线性代数的快速方法

1 数学/线性代数里,其实很多东西的求得都有多种解决办法 很多概念,界定狠清晰,但是不好求 多种方法,拓宽思维 方法1:按定义直接去求解 方法2:按 2 比如求逆矩阵 概念方法,线性变化 增广矩阵…

JS 常见的 6 种继承方式

原型链继承 原型链继承是比较常见的继承方式之一,其中涉及的构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指…

WebSocket协议

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输 HTTP协议和WebSocket协议对比: HTTP是短连接WebSocket是长连接HT…

【遮天】李小曼回归,新形象无差云曦,短板竟是身材?

Hello,小伙伴们,我是小郑继续为大家深度解析遮天 最新一集《遮天》已经更新,在成功卖掉段德之后,叶凡便离开妖帝坟冢,毕竟他身上拥有庞博从妖帝坟冢带出来的道经和被誉为中州至宝的绿铜 虽然这两样物品都在叶凡的苦海中&#xff0…

【Linux】序列化与反序列化

目录 前言 什么是应用层? 再谈"协议" 什么是序列化和反序列化 网络版计算器 整体流程实现 Sock.hpp的实现 TcpServer.hpp的实现 Protocol.hpp的实现 CalServer.cc的编写 CalClient.cc的编写 整体代码 前言 本章是属于TCP/UDP四层模型中的第一层…

VSCode连接服务器

Pycharm连接服务器参考我的另一篇文章Pycharm远程连接服务器_pycharm进入服务器虚拟环境终端_Jumbo星的博客-CSDN博客 本质上Pycharm和VSCode都只是IDE,没有什么好坏之分。但是因为Pycharm连接服务器(准确来说是部署)需要买professional。而…

价格战开打!技术比拼升级,AR HUD“普及化”如何破局?

眼下,AR HUD的装载量迎来了高速增长,但同时“价格战”也已经悄然打响。 根据《高工智能汽车》了解,伴随着越来越多汽车品牌搭载AR HUD,AR HUD前装供货价格已经下降至2000元以下,部分产品甚至跌破了1000元。 多位企业…

Shell 脚本入门

目录 一、Shell是什么 1.1 我们为什么要学习Shell和使用Shell? 1.2 Shell的分类有哪些? 二、Shell脚本入门知识 2.1 Shell文件命名规范 2.2 Shell解析器 2.3 用Shell 编写hello World 三、Shell的四种变量类型 3.1 系统预定义变量 3.2 自定义变…

JavaWeb 速通Ajax

目录 一、Ajax快速入门 1.基本介绍 : 2.使用原理 : 二、Ajax经典入门案例 1.需求 : 2.前端页面实现 : 3. 处理HTTP请求的servlet实现 4.引入jar包及druid配置文件、工具类 : 5.Domain层实现 : 6.DAO层实现 : 7.Service层实现 : 8.运行测试 : 三、JQuery操作Ajax 1 …