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

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


一、概念介绍


缓存穿透:

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

【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扩展 列转行方法&#xff08;2*2矩阵转换&#xff09;/// </summary>/// <param name"dtSource">数据源</param>/// <param name"columnFilter">逗号分隔 如SDateTime,PM25,PM10…...

Decomposed Prompting: A MODULAR APPROACH FOR SOLVING COMPLEX TASKS

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

​无需测试环境!如何利用测试脚手架隔离微服务,实现功能自动化

想在不建立完整测试环境的情况下测试微服务&#xff1f; 想在将变更推送到主线分支之前完成测试&#xff1f; 这是我们在进行项目交付时经常遇到的难题。最近&#xff0c;当我们开始一个新的项目&#xff0c;为客户构建一个新的聚合平台时&#xff0c;我们希望将尽可能多的测…...

HOperatorSet.Connection 有内存泄漏或缓存

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

力扣2. 两数相加

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

无涯教程-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波特率的这个界面刚用的时候觉得非常难用&#xff0c;怎么都配置不到想要的波特率。接下来为大家做一下简单的分析。 时钟分析 STM32F4的CAN时钟来自APB1 在如下界面配置&#xff0c;最好配置为1个整一点的数。…...

每日后端面试5题 第十天

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

荷兰国旗问题之快速分组

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

只允许程序单实例运行

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

巨人互动|Facebook海外户Facebook游戏全球发布实用策略

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

【Java架构-版本控制】-Git进阶

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

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...