缓存穿透、缓存击穿、缓存雪崩
一、概念介绍
缓存穿透:
定义:缓存穿透指的是请求查询缓存和数据库中都不存在的数据,从而导致每次请求都直接访问数据库。
原因:通常是由于恶意请求、非法输入或系统漏洞导致的。攻击者故意提交无效的查询,绕过缓存直接访问数据库。
影响:频繁的缓存穿透会导致数据库负载增加,消耗额外的资源,并可能引起拒绝服务(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中查询数据。造成性能的消耗。
相关文章:

缓存穿透、缓存击穿、缓存雪崩
一、概念介绍 缓存穿透: 定义:缓存穿透指的是请求查询缓存和数据库中都不存在的数据,从而导致每次请求都直接访问数据库。 原因:通常是由于恶意请求、非法输入或系统漏洞导致的。攻击者故意提交无效的查询,绕过缓存直…...

1978-2022年全国整体GDP平减指数计算模板(可任意调整基期)
1978-2022年全国整体GDP平减指数计算模板(可任意调整基期) 1、时间区间:1978-2022年 2、指标:名义GDP、实际GDP、GDP平减指数 3、中国GDP平减指数计算公式可以给定基期,自动计算平减指数,可根据需要任意…...

sklearn 笔记: neighbors.BallTree
球树结构 1 基本使用方法 sklearn.neighbors.BallTree(X, leaf_size40, metricminkowski, **kwargs) 2 主要参数说明 X 输入数据,维度为 (n_samples, n_features) n_samples 是数据集中点的数量n_features 是参数空间的维数leaf_size 点数少于多少时,…...

【java】【已解决】IDEA启动报错:Lombok Requires Annotation Processing
解决办法: 1、根据异常提示操作: 直接点击错误提示后面的蓝色标识【Enable】(小编点完了所以变灰色),此操作等价于下面的步骤: 【File】-->【Settings】-->【Build】-->【Compiler】-->【Ann…...

生物笔记——暑期学习笔记(三)
生物笔记——暑期学习笔记(三) 文章目录 前言一、R篇1. 数据筛选2. 字符串处理3. 练习 二、生信篇1. blast 基因家族鉴定2. hmm鉴定3. 理化性质与亚细胞定位4. 基因重复类型分析5. 家族成员染色体位置分析6. 基因组共线性分析7. 多序列比对,构…...

EPICS自定义设备支持--longin记录的设备支持编写
以下详细描述了一个longin记录设备支持模块编写过程以及用于测试这个模块的IOC的操作步骤: 1)创建一个目录lidriver用于保存这个IOC目录结构: orangepiorangepi4-lts:~/epics$ mkdir lidriver orangepiorangepi4-lts:~/epics$ ls example …...

SpringCloud(十)——ElasticSearch简单了解(二)DSL查询语句及RestClient查询文档
文章目录 1. DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.3 精确查询1.4 地理查询1.5 查询算分1.6 布尔查询1.7 结果排序1.8 分页查询1.9 高亮显示 2. RestClient查询文档2.1 查询全部2.2 其他查询语句2.3 排序和分页2.4 高亮显示 1. DSL查询文档 1.1 DSL查询分类 查询所有…...

Python Flask Web开发一:环境搭建
一、创建环境 创建一个项目文件夹和一个.venv文件夹 $ mkdir myproject $ cd myproject $ python3 -m venv .venv 二、激活环境 在开始项目之前,请激活相应的环境 激活成功的话会在开发工具自带的终端那里看到以(.venv)开头的 $ . .venv…...

DataTable扩展 列转行方法(2*2矩阵转换)
源数据 如图所示 // <summary>/// DataTable扩展 列转行方法(2*2矩阵转换)/// </summary>/// <param name"dtSource">数据源</param>/// <param name"columnFilter">逗号分隔 如SDateTime,PM25,PM10…...

Decomposed Prompting: A MODULAR APPROACH FOR SOLVING COMPLEX TASKS
本文是LLM系列文章,针对《Decomposed Prompting: A MODULAR APPROACH FOR SOLVING COMPLEX TASKS》的翻译。 分解提示:一种求解复杂任务的模块化方法 摘要1 引言2 相关工作3 分解提示4 案例5 结论 摘要 小样本提示是一种使用大型语言模型(L…...

无需测试环境!如何利用测试脚手架隔离微服务,实现功能自动化
想在不建立完整测试环境的情况下测试微服务? 想在将变更推送到主线分支之前完成测试? 这是我们在进行项目交付时经常遇到的难题。最近,当我们开始一个新的项目,为客户构建一个新的聚合平台时,我们希望将尽可能多的测…...

HOperatorSet.Connection 有内存泄漏或缓存
开发环境 Win7 VS2002 halcon12, 直接运行Debug的exe 宽高5000,单格1*1的棋盘占用内存 手动释放region regionConnect private void butTemp_Click(object sender, EventArgs e) { butTemp.Enabled false; HOperatorS…...

力扣2. 两数相加
2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…...

无涯教程-Android Intent Standard Extra Data函数
下表列出了各种重要的Android Intent Standard Extra Data。您可以查看Android官方文档以获取额外数据的完整列表- Sr.NoExtra Data & Description1 EXTRA_ALARM_COUNT 用作AlarmManager intents(意图)中的int Extra字段,以告诉正在调用的应用程序intents(意图)释放了多少…...

STM32 CAN 波特率计算分析
这里写目录标题 前言时钟分析时钟元到BIT 前言 CubeMX中配置CAN波特率的这个界面刚用的时候觉得非常难用,怎么都配置不到想要的波特率。接下来为大家做一下简单的分析。 时钟分析 STM32F4的CAN时钟来自APB1 在如下界面配置,最好配置为1个整一点的数。…...

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

荷兰国旗问题之快速分组
朋友们,现在我出一个非常简单的问题,给你一个数组,把它进行处理,变成左边小,中间相等,右边大的一个数组,如何解决呢,这里涉及到一个基本方法叫分组,今天咱们不解决这个问…...

只允许程序单实例运行
有时候,我们只能允许程序单实例运行,以免程序运行出错。可以通过使用App.PrevInstance和系统级的Mutex等多种办法来实现。 代码如下: 用户昵称: 留下些什么 个人简介: 一个会做软件的货代 CSDN网址:https://blog.csdn.net/zezes…...

巨人互动|Facebook海外户Facebook游戏全球发布实用策略
Facebook是全球最大的社交媒体平台之一,拥有庞大的用户基数和广阔的市场。对于游戏开发商而言,利用Facebook进行全球发布是一项重要的策略。下面小编将介绍一些实用的策略帮助开发商在Facebook上进行游戏全球发布。 巨人互动|Facebook海外户&Faceboo…...

【Java架构-版本控制】-Git进阶
本文摘要 Git作为版本控制工具,使用非常广泛,在此咱们由浅入深,分三篇文章(Git基础、Git进阶、Gitlab搭那家)来深入学习Git 文章目录 本文摘要1. Git分支管理2. Git分支本质2.1 分支流转流程(只新增文件)2.2 分支流转流…...

业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!
大家是否遇到过下列问题—— 在开发的时候,遇到 bug 需要反馈… 有合作意向的时候,想更多了解业务和相关产品… 在接入的时候,需要得到专业技术支持… 别急,荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明࿱…...

MybatisPlus插件篇—逻辑删除+p6spy
文章目录 一、前言二、插件1、逻辑删除1.1、官方说明:1.2、配置依赖1.3、配置全局配置1.4、实体类字段上添加TableLogic注解1.5、验证是否成功 2、执行SQL分析打印2.1、配置依赖2.2、数据库驱动配置2.3、spy配置文件配置2.4、注意事项 三、总结提升 一、前言 本文将…...

Android studio中EditText设置默认值
如果想对EditText设置默认值,在java代码中使用setText函数是不行的,需要在layout文件中设置“text变量”,如下所示设置默认值为“192.168.1.1”: <EditTextandroid:id"id/car1_ip_edit"android:layout_width"1…...

《Java面向对象程序设计》学习笔记——第 13 章 泛型与集合框架
笔记汇总:《Java面向对象程序设计》学习笔记 # 第 13 章 泛型与集合框架 Java 提供了实现常见数据结构的类,这些实现数据结构的类通称为 Java 集合框架。 在 JDK1.5 后, Java 集合框架开始支持泛型,本章首先介绍泛型&#…...

python进阶--魔法方法之类的表示
下面的魔法方法都可以用了描述类 1、__str__ 该方法一般返回字符串,也许不会返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。在类中重写该方法,用来输出类的属性值等信息 调用:str(object)或者内置函数format()或者print()都会调用__str__()方法 c…...

JVM 创建对象时分配内存的几种方法、分配方法的选择
创建对象分配内存的方法 指针碰撞 假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大…...

08-Vue基础之组件
个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习目标: 坚持每一次的学习打卡 文章…...

Kotlin学习之密封类
Kotlin中的密封类: kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。 当我们想定义一个有相同父类,但是有不同子类的时候…...

opencv鼠标事件函数setMouseCallback()详解
文章目录 opencv鼠标事件函数setMouseCallback()详解1、鼠标事件函数:(1)鼠标事件函数原型:setMouseCallback(),此函数会在调用之后不断查询回调函数onMouse(),直到窗口销毁(2)回调函…...

硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)
1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus,缩写:USB)是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视&a…...