Redis缓存穿透及常见的解决方案

一.什么是缓存穿透?

缓存穿透是指当客户端请求的数据在缓存(如 Redis)中不存在,并且在数据库中也不存在时,直接绕过缓存去请求数据库。这种情况会导致:

  • 缓存系统无法发挥作用,数据每次都会直接请求数据库。
  • 在某些恶意请求的情况下(例如攻击者故意频繁请求不存在的数据),会产生大量查询请求,给数据库带来很大的压力,可能导致数据库宕机或服务性能大幅下降。
        缓存穿透通常是由查询一个在数据库中根本不存在的对象引起的,特别是当没有合理的过滤机制时,攻击者可以发送大量的无效请求,这些请求由于缓存中没有,因此每次都会打到数据库,极大增加了数据库的负担。图例如下

            

二.常见的两种解决方案-----缓存空对象布隆过滤器

方案一:缓存空对象

缓存空对象的做法是指:当缓存和数据库中都查不到某个请求的数据时,将一个空对象(如null值或占位符)缓存起来,并且设置一个合理的过期时间(TTL,Time To Live),从而避免相同的无效请求反复查询数据库。
优点
  • 实现简单,维护方便:这种方法不需要额外的复杂逻辑,只需简单地在查不到数据时将结果缓存起来,并设置一个过期时间。后续如果有相同的数据请求,就可以直接从缓存中返回空值,而不再查询数据库。
缺点
  • 内存消耗:缓存空对象的做法虽然有效避免了频繁访问数据库,但会在缓存中存储大量空对象,可能会造成额外的内存消耗,尤其是在高并发请求下,存储这些空数据会占用一定的内存空间。
  • 数据不一致问题:如果数据在短时间内被插入数据库,而之前的空对象缓存还没有过期,可能会导致短时间内的数据不一致问题。解决办法是合理地设置TTL,让空对象缓存尽快过期。
具体流程

                                  

  1. 请求 Redis:客户端首先向缓存(Redis)发出请求。
  2. 未命中:如果缓存中没有该数据,则继续向下一个数据源(即数据库)请求。
  3. 请求数据库:缓存未命中的情况下,会请求数据库。
  4. 如果数据库中也没有相应的数据,就将null值或者空对象存储到缓存中,并设置TTL,避免后续重复请求同样不存在的数据直接查询数据库。
  5. 返回数据:如果数据库中有数据,则将数据缓存到 Redis,并返回给客户端。
这种方案适合那些请求频次较高但数据缺失的情况,通过缓存空对象来防止数据库压力过大。

方案二:布隆过滤器

布隆过滤器-----是一种空间效率非常高的概率性数据结构,它能够判断某个数据是否存在于集合中。布隆过滤器可以有效减少无效请求对数据库的影响。
工作原理
布隆过滤器通过多个哈希函数将数据映射到一个位数组中,如果某个数据不在位数组中,则可以确定数据在数据库中也不存在。反之,如果布隆过滤器认为数据存在,它有可能存在,但也可能是误判(因为布隆过滤器存在一定的误报率)。
优点
  • 内存占用少:布隆过滤器的空间复杂度很低,即使处理海量数据也不会占用过多内存。
  • 有效减少数据库请求:由于布隆过滤器能够判断某个请求是否必定不在数据库中,对于那些不在数据库中的请求,布隆过滤器会直接拒绝掉,防止其打到数据库。
缺点
  • 存在误判的可能性:布隆过滤器是一个概率性数据结构,存在一定的误判率,也就是说,布隆过滤器可能会误判某个数据存在,但实际上它并不存在。这种情况下,数据仍会打到数据库,增加一定的压力。
  • 实现复杂:布隆过滤器的实现和维护比缓存空对象要复杂,尤其是当需要动态调整数据时,如何扩展位数组、调整哈希函数等都需要额外的考虑。
图示流程

                

  1. 请求布隆过滤器:客户端请求数据时,首先会通过布隆过滤器判断数据是否存在。
  2. 数据不存在:如果布隆过滤器判断数据不存在,那么请求会被直接拒绝掉,避免继续访问缓存或数据库。
  3. 放行请求:如果布隆过滤器判断数据可能存在,则允许请求继续。
  4. 请求 Redis:接下来,客户端请求 Redis 缓存。
    • 缓存命中:如果缓存中存在数据,则直接返回数据。
    • 缓存未命中:如果缓存中没有该数据,系统会继续请求数据库。
  5. 查询数据库:如果缓存和布隆过滤器都没法满足请求,则会查询数据库。
  6. 缓存数据:在数据库中查询到数据后,将数据缓存到 Redis,并返回给客户端。

三.两种方案的比较

  • 缓存空对象-----------更适合于简单实现和维护,适合那些在请求频次高且不存在数据的情况下,通过缓存空对象来防止对数据库的频繁访问。但需要注意内存占用和数据一致性的问题。

  • 布隆过滤器-----------适用于需要处理大量请求且数据比较稀疏的场景。它通过高效的内存占用来判断请求的数据是否可能存在,减少无效的数据库查询。但是布隆过滤器存在误判可能,且实现起来更为复杂,适用于对内存要求较高的应用。

四.其他的解决方案

1.增强id的复杂度,避免被猜测id规律  

        增强ID的复杂度是为了防止攻击者通过简单的递增规律或某些特定模式猜测系统中的ID,这可能导致数据被恶意爬取或被利用进行攻击。增加ID的随机性和复杂度,如使用UUID或者其他加密形式的ID,可以有效防止这种情况发生。

2.做好数据的基础格式校验

        在接收到请求的数据时,对数据的基础格式进行校验是很重要的。包括但不限于检查输入是否符合预期的数据类型、范围以及结构等。这可以有效防止SQL注入攻击、数据越界问题以及其它利用不规范输入进行攻击的行为。例如:确保数字输入确实是数字。验证字符串长度是否在预期范围内。

3.加强用户权限校验

        权限控制是系统安全的重要一环。需要确保每个用户只能访问其有权访问的数据和资源。加强用户权限校验可以有效防止越权访问的问题,确保敏感数据的安全。
        例如,验证当前用户是否具有请求资源的权限,以及检查操作的上下文是否匹配用户的角色和身份。

4.做好热点参数的限流

        对一些“热点参数”的请求进行限流可以有效防止恶意刷接口或者因为某些流量高峰导致服务不可用。热点参数通常是指那些被频繁请求的数据或资源,攻击者可能利用这些参数进行频繁的恶意请求。

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

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

相关文章

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…

windows下安装wsl的ubuntu,同时配置深度学习环境

写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块,只需要在文件中通过require(http)引入即可。…

AI赋能电商:构建高效、智能化的新零售生态

随着人工智能(AI)技术的不断进步,其在电商领域的应用日益广泛,从购物推荐到供应链管理,再到商品定价,AI正在全面改变传统电商的运营模式,并推动行业向智能化和精细化方向发展。本文将探讨如何利…

算法之区间和题目讲解

题干 难度:简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而,区间在输入的最下面,所以按照暴力破解的思路,我们首先要遍历数组,把它的值都存进去。 然后,遍历下面的区间,从索引a…

openssl颁发包含主题替代名的证书–SAN

原文地址:openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中,commonName(CN)字段只能有一个值。如果让证书支持多个域名和IP地址,…

从尾到头打印链表 剑指offer

题目描述 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。 链表节点定义如下: struct ListNode {int m_nKey;ListNode*m_pNext; }; 代码实现 栈实现: 递归实现: 但是用递归实现可能存在的问题:

ajax基础

一:express框架 在终端输入nodejs文件名 // 引入express const express require(express); //创建应用对象 const app express(); //创建路由规则 app.get(/,(request,response) > {//设置响应response.send(Hello Express); }); // 监听3000端口 app.lis…

免费实用在线AI工具集合 - 加菲工具

免费在线工具-加菲工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/h…

UE5肉鸽游戏教程学习

学习地址推荐:UE5肉鸽项目实战教程_哔哩哔哩_bilibili

101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)

一、前言 这份报告是一份关于集团信息化顶层规划设计的总体解决方案,旨在通过信息化转型提升集团管控和企业运营效率。报告回顾了项目的背景、目标和工作过程,分析了集团面临的内部和外部挑战,并提出了一系列解决方案,包括自上而…

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 …

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为 follower 节点…

STM32端口模拟编码器输入

文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…

【Mybatis】@Param注解 resultMap手动映射

文章目录 一、映射文件参数二、查询映射2-1 一对一2-2 一对多2-3 总结 一、映射文件参数 Param 注解官方文档解释 1、单个参数&#xff08;对象&#xff09;不使用注解 public int save(User user);<!-- 添加用户 --> <insert id"save" parameterType&quo…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门&#xff0c;从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗&#xff1f; 把业务逻辑写入数据库&#xff0c;重新定义简单与效率。…

C#基础上机练习题

21.计算500-800区间内素数的个数cn&#xff0c;并按所求素数的值从大到小的顺序排列&#xff0c;再计算其间隔加、减之和&#xff0c;即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求&#xff0c;把结果cn和sum输出。 22.在三位整数…

【STM32】在 STM32 USB 设备库添加新的设备类

说实话&#xff0c;我非常想吐槽 STM32 的 USB device library&#xff0c;总感觉很混乱。 USB Device library architecture 根据架构图&#xff1a; Adding a custom class 如果你想添加新的设备类&#xff0c;必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…

多头数(head number);d_model、d_k;词嵌入维度之间的关系;多头是对不同维度的特征分开提取,意义在于将并行执行

目录 多头是对不同维度的特征分开提取,意义在于将并行执行 之后的每头提取的特征仅仅进行矩阵拼接 多头数(head number) d_model、d_k 词嵌入维度之间的关系 词嵌入的维度(d_model)决定了权重矩阵的形状 一、概念解释 二、关系举例说明 多头数,权重矩阵的长度和词…

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具&#xff0c;它以项目对象模型&#xff08;POM&#xff09;为基础进行项目管理&#xff0c;通过POM文件来定义项目信息和依赖关系。同时&#xff0c;它也是构建自动化工具&#xff0…