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; }; 代码实现 栈实现: 递归实现: 但是用递归实现可能存在的问题:

安装 Docker(使用国内源)

一、安装Docker-ce 1、下载阿里云的repo源 [rootlocalhost ~]# yum install yum-utils -y && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache # 尝试列出 docker-ce 的版本 [rootlocalh…

Django 自定义路由转换器

步骤 创建自定义转换器类 必须定义 regex 属性(用于匹配参数)。必须实现 to_python 和 to_url 方法。 to_python: 将匹配的参数转换为视图函数可用的 Python 数据。to_url: 将数据转换为 URL 格式(用于反向解析)。 注册转换器 使用…

【Python】构建事件驱动架构:用Python实现实时应用的高效系统

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…

【数据分析】基于GEE实现大津算法提取洞庭湖流域水体

大津算法提取水体 1.写在前面2.洞庭湖水体识别1.写在前面 最大类间方差法,也称为Otsu或大津法,是一种高效的图像二值化算法,由日本学者Otsu于1979年提出。该算法基于图像的频率分布直方图,假设图像包含两类像素(前景和背景),并计算出一个最佳阈值,以最大化类间方差,从…

ajax基础

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

Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别

文章目录 Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别1. Jakarta EE 迁移2. Spring Security 配置方式的变化3. PasswordEncoder 加密方式的变化4. permitAll() 和 authenticated() 的变化5. 更强的默认安全设置6. Java 17 支持与语法提升7. PreAuthorize、…

免费实用在线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 和 …

手机无法连接服务器1302什么意思?

你有没有遇到过手机无法连接服务器,屏幕上显示“1302”这样的错误代码?尤其是在急需使用手机进行工作或联系朋友时,突然出现的连接问题无疑会带来不少麻烦。那么,什么是1302错误,它又意味着什么呢? 1302错…

Python 网络爬虫操作指南

网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南,帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…