Redis缓存穿透

news2025/4/16 18:43:04

缓存穿透

缓存穿透说简单点就是⼤量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,
根本没有经过缓存这⼀层。举个例⼦:某个⿊客故意制造我们缓存中不存在的 key 发起⼤量
请求,导致⼤量请求落到数据库。
总结⼀下就是:

  1. 缓存层不命中。
  2. 存储层不命中,不将空结果写回缓存。
  3. 返回空结果给客户端。
    ⼀般 MySQL 默认的最⼤连接数在 150 左右,这个可以通过 show variables like
    ‘%max_connections%’; 命令来查看。最⼤连接数⼀个还只是⼀个指标,cpu,内存,磁盘,⽹
    络等物理条件都是其运⾏指标,这些指标都会限制其并发能⼒!所以,⼀般 3000 的并发请
    求就能打死⼤部分数据库了。

解决方案:
最基本的就是⾸先做好参数校验,⼀些不合法的参数请求直接抛出异常信息返回给客户端。
⽐如查询的数据库 id 不能⼩于 0、传⼊的邮箱格式不对的时候直接返回错误消息给客户端
等等。
参数校验通过的情况还是会出现缓存穿透,我们还可以通过以下⼏个⽅案来解决这个问题:

1)缓存⽆效 key : 如果缓存和数据库都查不到某个 key 的数据就写⼀个到 redis 中去并设
置过期时间,具体命令如下: SET key value EX 10086 。这种⽅式可以解决请求的 key 变化
不频繁的情况,如何⿊客恶意攻击,每次构建的不同的请求 key,会导致 redis 中缓存⼤量
⽆效的 key 。很明显,这种⽅案并不能从根本上解决此问题。如果⾮要⽤这种⽅式来解决穿
透问题的话,尽量将⽆效的 key 的过期时间设置短⼀点⽐如 1 分钟。
另外,这⾥多说⼀嘴,⼀般情况下我们是这样设计 key 的: 表名:列名:主键名:主键值。

2)布隆过滤器: 布隆过滤器是⼀个⾮常神奇的数据结构,通过它我们可以⾮常⽅便地判断
⼀个给定数据是否存在于海量数据中。我们需要的就是判断 key 是否合法,有没有感觉布隆
过滤器就是我们想要找的那个“⼈”。

布隆过滤器在针对海量数据去重或者验证数据合法性的时候⾮常有⽤。布隆过滤器的本质实
际上是 “位(bit)数组”,也就是说每⼀个存⼊布隆过滤器的数据都只占⼀位。相⽐于我们平
时常⽤的的 List、Map 、Set 等数据结构,它占⽤空间更少并且效率更⾼,但是缺点是其
返回的结果是概率性的,⽽不是⾮常准确的。
当⼀个元素加⼊布隆过滤器中的时候,会进⾏如下操作:
1. 使⽤布隆过滤器中的哈希函数对元素值进⾏计算,得到哈希值(有⼏个哈希函数得到⼏
个哈希值)。
2. 根据得到的哈希值,在位数组中把对应下标的值置为 1。
当我们需要判断⼀个元素是否存在于布隆过滤器的时候,会进⾏如下操作:
1. 对给定元素再次进⾏相同的哈希计算;
2. 得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布
隆过滤器中,如果存在⼀个值不为 1,说明该元素不在布隆过滤器中。
举个简单的例⼦:


如图所示,当字符串存储要加⼊到布隆过滤器中时,该字符串⾸先由多个哈希函数⽣成不同
的哈希值,然后在对应的位数组的下表的元素设置为 1(当位数组初始化时 ,所有位置均为
0)。当第⼆次存储相同字符串时,因为先前的对应位置已设置为 1,所以很容易知道此值
已经存在(去重⾮常⽅便)。
如果我们需要判断某个字符串是否在布隆过滤器中时,只需要对给定字符串再次进⾏相同的
哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个
值在布隆过滤器中,如果存在⼀个值不为 1,说明该元素不在布隆过滤器中。

不同的字符串可能哈希出来的位置相同,这种情况我们可以适当增加位数组⼤⼩或者调整我
们的哈希函数。

综上,我们可以得出:布隆过滤器说某个元素存在,⼩概率会误判。布隆过滤器说某个元素
不在,那么这个元素⼀定不在

把所有可能存在的请求的值都存放在布隆过滤器中,当⽤户请求过来,我会先判断⽤户发来的请求的
值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会
⾛下⾯的流程。

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

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

相关文章

http笔记

文章目录1、什么是http?2、http报文格式3、请求报文1、认识URL2、认识http方法3、认识header4、响应报文5、https加密机制1、什么是http? http是应用层最广泛使用的协议之一;其中浏览器获取到网页就是基于http实现的;http就是浏览…

Caddy2学习笔记——Caddy2反向代理docker版本的DERP中继服务器

一、个人环境概述 本人拥有一个国内云服务商的云主机和一个备案好的域名,通过caddy2来作为web服务器。我的云主机系统是Ubuntu。 我的云主机是公网ip,地址为:43.126.100.78;我备案好的域名是:hotgirl.com。后面的文章…

【量化交易笔记】3.实现数据库保存数据

上一节,我们通过下载相关的 pandas 数据保存为 本地csv文件,这一节将上节的数据以数据库方式保存。 数据库保存 采集数据部分前一节已做说明,这里就直接用采用前面的内容。这里着重说明的事数据库连接。对与 python 相连接的数据库有很多&a…

玩转Python的交互(命令行)模式

我喜欢使用Python的交互界面(命令行模式)来运行和调试Python代码。为什么不用PyCharm、VSCode?因为先入为主,加上我的DOS命令行的情结,我第一次安装使用Python就是用这种黑白界面的,平时写代码惯用EmEditor…

MySQL慢查询

2 慢查询 2.1 慢查询介绍 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。具体指运行时间超过long_query_time值的SQL&…

软件测试之快速熟悉项目

快速熟悉项目 1、了解项目架构 C/S架构 C/S 代表的是客户端/服务器(client/server),这类软件的使用者需要在本地电脑安装客户端程序,例如:QQ。 优点:安全性高。 缺点:一旦软件有更新,用户需要手动下载&am…

Rust 开发系列PyO3:Rust与Python的联动编程(中)

第三节:对比C语言的Python原生扩展开发模式 C/c编写Python扩展的方法,与Rust大致是相同的,如果不论语言本身的语法带来的繁琐的话,就单纯以开发步骤和模式来看,原生语言写扩展的步骤更为标准和简单。 大致来说&#…

QT入门Item Views之QTreeView

目录 一、QTreeView界面相关 1、布局介绍 二、基本属性功能 1、设置单元格不能编辑 2、一次选中一个item 3、去掉鼠标移动到单元格上的虚线框 4、最后一列自适应 三、代码展示 1、创建模型,导入模型 2、 右键菜单栏 3、双…

深度学习模型训练工作汇报(3.8)

进行数据的初始整理的准备 主要是进行伪序列字典的设置,以及训练数据集的准备。 期间需要的一些问题包括在读取文件信息的时候,需要跳过文件的第一行或者前两行,如果使用循环判断的话,会多进行n次的运算,这是不划算的…

003+limou+HTML——(3)HTML列表

000、前言 列表是网页常见的一种数据排列方式,在HTMl中列表一共有三种:有序列表、无序列表、定义列表(另外“目录列表dir”和“菜单列表menu”已经在HTML5中被废除了,现在都是使用无序列表ul来替代) 001、有序列表&a…

C/C++指针与数组(一)

预备知识 1、数据的存储 2、基本内建类型 1)类型的大小 C offers a flexible standard with some guaranteed minimum sizes, which it takes from C: A short integer is at least 16 bits wide.An int integer is at least as big as short.A long integer is a…

Spring Cloud学习笔记:基础知识

这是本人学习的总结,主要学习资料如下 马士兵教育 目录1、Spring Cloud 简介2、Eureka3、建立Spring Cloud项目3.1、启动Server3.1.1、dependency3.1.2、配置文件3.1.3、Server端启动代码3.2、启动Client3.2.1、dependency3.2.2、配置文件3.3.3、Client端启动代码3…

Go之入门(特性、变量、常量、数据类型)

一、Go语言特性 语法简单并发性。Go语言引入了协程goroutine,实现了并发编程内存分配。Go语言为了解决高并发下内存的分配和管理,选择了tcmalloc进行内存分配(为了并发设计的高性能内存分配组件,使用cache为当前线程提供无锁分配…

电脑自动重启是什么原因?详细解说

案例:电脑自动重启是什么原因? “一台用了一年的电脑,最近使用,每天都会一两次莫名其妙自动重启,看了电脑错误日志,看不懂什么意思,一直找不到答案。有没有高手知道怎么解决这个问题的。” 当…

仿写简单IOC

目录 TestController类: UserService类: 核心代码SpringIOC: Autowired和Component注解 SpringIOCTest 类 ​编辑 总结: TestController类: Component public class TestController {Autowiredprivate UserService userService;public void test…

RocketMQ如何测试

RocketMQ如何测试MQ简介RocketMQRocketMQ测试点MQ简介 MQ:Message Queue,即消息队列,是一种应用程序之间的消息通信,简单理解就是A服务不断的往队列里发布信息,另一服务B从队列中读取消息并执行处理,消息发…

同步、异步ETL架构的比较

背景介绍: 数据的抽取,转换和加载 (ETL, Extract, Transform, Load) 是构建数据仓库过程中最复杂也是至 关重要的一个步骤,我们通常用两种办法来处理 ETL 流程: 一种是异步(Asynchronous) ETL 方式, 也称为文本文件(Flat file)方式。 另外…

华为云平台架构名词解释

名词解释 网络设备 ISW(外网接入交换机):出口交换机,常用于和外网建立静态/BGP路由互联 CSW (内网接入交换机):专线接入(用户内网骨干)交换机,用户自有网络…

一场以数字技术深度影响和改造传统实业的新风口,正在开启

当数字经济的浪潮开始上演,一场以数字技术深度影响和改造传统实业的新风口,正在开启。对于诸多在互联网时代看似业已走入死胡同的物种来讲,可以说是打开了新的天窗。对于金融科技来讲,同样如此。以往,谈及金融科技&…

蓝桥杯-左移右移(2022国赛)

蓝桥杯-左移右移1、问题描述2、解题思路与代码实现2.1 方法一:使用LinkedList双向链表实现(50%)2.2 方法二:使用HashMap左右临界值实现(100%)1、问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3,…N 。 之后小蓝对这个数组进行了 M 次操…