缓存穿透-总结

news2024/9/28 9:30:48

目录

缓存穿透-总结

出现场景:

解决方法:

方法1.缓存空对象:

方法2.加一个布隆过滤器:

总结:


缓存穿透-总结

出现场景:

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效。如果有恶

意用户构建并发线程一直故意请求缓存和数据库中都不存在的数据的话,那么这些请求一直都会打

到数据库,就会造成缓存穿透问题。

解决方法:

方法1.缓存空对象:

思路总结:

当我们查询Redis缓存没有查询到,并且查询数据库没有查询到对应数据时,我们在Redis缓存一个null。当出现上述的情况时,就会直接返回一个null。目的就是为了进行避免多次甚至更多次的恶意请求导致一直访问攻击数据库 ,导致缓存穿透。

优点:

实现简单,维护方便。

缺点:

(1) 额外的内存消耗

分析:

我们想要查询一个id对应在数据库中的数据,当我们查询Redis缓存中没有时,数据库中进行查询也没有对应请求想要查询的数据,此时就会返回一个null值给客户端。

我们可以在redis缓存中给对应id进行缓存一个对应的null(垃圾数据),当下一次再请求相同的id对应的数据时,直接返回缓存中对应存储的null值即可。

但是会产生额外的内存消耗,因为可能客户端恶意请求数据库中其它不存在的id,这样我们就需要缓存多个null在缓存中,多个null对应多个数据库中不存在的数据值。

因此我们可以进行设定TTL这个exprie方法对应的失效时间。我们尽可能的缩短这个TTL对应的时间,这样一段时间没有命中缓存中某一个null值后,该null值就会失效,减小一点额外内存的消耗。

(2) 可能造成短期的不一致

分析:

我们可以在redis缓存中给对应id进行缓存一个对应的null(垃圾数据),当下一次再请求相同的id对应的数据时,直接返回缓存中对应存储的null值即可。

但是在缓存一个null之后,我们对请求的这个数据 对应在数据库中进行了更新操作。意思就是可以在数据库查询到id对应到数据库的数据 ,但是我们是先访问redis缓存的,所以就直接返回null。

这可能会导致短期的不一致。因此我们可以尽可能的缩短缓存null的TTL 缓存销毁时间。

方法2.加一个布隆过滤器:

布隆过滤器原理:

(1) 布隆过滤器是一种占用内存少,时间复杂度低的数据结构,当需要存储并访问海量数据的时候,我们通常使用布隆过滤器来取代替哈希表。

哈希表查询复杂度为O(1)级别,为什么在存储并访问海量数据时采用布隆过滤器呢?

因为哈希表的空间利用率低,存储等量的数据,但是需要占用较大的内存。之所以哈希表需要大量的内存占用是为了降低哈希冲突。举个例子:可能整一个哈希表只存储两个元素,但是哈希数组的长度就可能达到20,甚至更多。

(2) 布隆过滤器的底层是一个二级制的数组,这个数组是二进制的就可以说明它十分节省内存。

(3) 布隆过滤器优缺点:

优点:空间内存利用效率和查询数据的效率都远远超过一般的算法

缺点:有一定的误判率

(4) 结合这个缓存穿透的案例进行说明:

如下图:假设说布隆过滤器是由一个20位二进制,3个哈希函数组成的。

注释:A和B都是数据库中的数据值,这里只列出了A和B进行参考

步骤:

(1) 添加数据库中所有数据到布隆过滤器中:

数据库中的每一个数据元素经过这三个哈希函数处理运算后都能生成一个对应的索引位置。将每一个哈希函数生成的索引位置都设为1。

(2) 当客户端查询某一个数据,在访问缓存和数据库之前,都会优先去访问布隆过滤器:

如果客户端进行查询的某一个数据,它对应有一个哈希函数生成的索引位置处的二进制位的值不为1,就代表不存在。(100%正确)

分析:如果有一个索引位置对应的二进制值不为1,说明一定不存在。

如果客户端进行查询的某一个数据,它对应每一个哈希函数生成的索引位置处的二进制位的值都为1,就代表可能存在。

分析:为什么是可能存在?因为可能一个索引位置不止有一个数据元素进行指向引用,如图A和B就对7号位置进行了同时引用,即使A或B删除了一个,7号位置的值还是1。那么假设说数据库中有海量数据呢?这个同时引用的概率又大大的提升了。

(5) 添加,查询的时间复杂度都是:O(k),k是哈希函数的个数。空间复杂度是:O(m),m是二进制位的个数。

(6) 为什么布隆过滤器不适合删除元素?

因为哈希函数生成值具有随机性,可能一个二进制位置可能会有多个元素指向引用。(如:索引为7处的二进制位被元素A和B同时指向)。

那么当我们对元素B进行删除时,对于该元素的所有哈希指向的二进制位的值都需要改为0。但是元素A还是指向该二进制位置的,那么当我们判断A是否存在时就会产生误判,会判断出元素A是不存在的!

(7)布隆过滤器是不存储数据本身的,只是判断数据是否存在的性能比较优越。

思路总结:

(1) 在客户端和Redis之间加一个布隆过滤器,该布隆过滤器会把数据库中的所有数据都进行记录【具体如何记录的,见上布隆过滤器原理(4)-添加元素的讲解】。

(2) 当客户端进行请求一个数据时,优先访问布隆过滤器,若布隆过滤器判断出该数据是不存在的,那么直接拒绝该请求。如果判断该数据存在,那么放行该请求。【布隆过滤器是不存储数据本身的,只是判断数据是否存在的性能比较优越并且布隆过滤器说该数据存在是具有一定误差的,所以不可以直接返回数据

(3) 放行后,查询缓存,缓存命中,直接返回数据。缓存未命中,查询数据库。

(4) 查询数据库,查询到,缓存数据到缓存中,并且返回数据。数据库查询不到,结果还是造成了缓存穿透。

(5)由此可见,使用布隆过滤器是具有一定风险的。

优点:

占用内存较少

分析:它无需多余内存的消耗,只需要搞一个布隆过滤器,该布隆过滤器负责对数据库减压。

缺点:

同样会存在一些误差

分析:如果布隆过滤器判断出某个数据是不存在的,那么该数据一定是不存在的。但是要判断出某个数据是存在的,那么该数据可能是不存在的。

总结:

(1) 无论是方法1还是方法2,都是被动的解决方案,当缓存穿透的问题出现后进行被动的处理

对于这两种方法:方法2存在误判可能性,所以开发时使用方法1。

(2) 但是我们可以在出现缓存穿透这一问题之前,进行主动解决:

1.可以增加id的复杂度,这样可以避免恶意用户轻易的猜到id的规律

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

3.加强用户权限的校验

4.做好热点参数的限流,对热数据进行限流,降低缓存穿透的概率

总结不易,期待三连。

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

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

相关文章

光量子领域新突破:有望打造芯片工厂!

将2D材料与氮化硅谐振器混合集成,使一系列单光子源与硅基光子按需精准结合。(图片来源:网络)量子光子学的著名专家、电气和计算机工程助理教授Galan Moody的实验室成功创造了一种在芯片上产生单光子的新方法。量子具有叠加态的特性…

飞桨特色产业级模型库,助力AI开发与落地更简单!

飞桨在长期的产业实践中发现,开发者使用开源模型项目落地普遍会遇到三大难题: 算法和模型繁多,做模型选择是个难题; 模型效果不错,但产业落地时容易遇到资源限制和部署的问题; 面对新场景无从下手&#x…

minio public桶禁止在直接访问桶位置时列出所有文件url

minio的public桶因为没有限制,所以在直接访问到桶地址的时候会列出桶内所有文件的url,这样很不安全,如何禁止这个功能,可以使用三种方法 1、如果是新版的可以直接设置桶的Access Policy为自定义就好 编辑custom的Policy&#xff…

五种情况下企业需要引进低代码开发平台

随着低代码开发平台的热度在上升,企业中也开始流行一种新的应用交付方式:业务部门基于低代码开发平台将所需要的功能(或简单的可用版本)自行搭建出来,当遇到较为复杂的需求时,则向IT部门请求支援。业务与IT…

【MFC】模拟采集系统——数据绘制(19)

完成界面设计后,数据绘制也可以按照对MFC类派生来完成,值得注意的是这里的数据绘制仅仅是通过随机产生的数据来显示,并且显示的方法也有很多。 数据绘制 在主对话框中添加两个 Picture Control 位置大小任意,可以设置一下外观&a…

Python3 数据结构实例及演示

本章节主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,1句话概括即:列表可以修改,而字符串和元组不能。 以下是 Python 中列表的方法: 下面示…

阿里云服务器部署前后端分离项目

阿里云服务器部署 【若依】 前后端分离项目 文章目录一、域名解析二、服务器操作系统置空三、部署方式四、需安装环境配置五、Linux服务器安装相应内容(具体安装步骤)(一)安装JDK(3种方式)使用Yum安装&…

Assignment写作各个部分怎么衔接完美?

Assignment格式很简单,就只有四个部分,按着通用的套路来,发现也没什么难度。不过这4个部分自己需要衔接完美,下面就给大家分享一下写Assignment最简单的方法。 如果没有目录可以放在第一页的开头,用“标题字体”加重显…

互联网大厂Java岗最全八股文面试1100道真题汇总,堪称2023年面试天花板

2023 年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套 1100道的 Java 面试手册是行业内各大神联合总结出来的,上传到 Git 上目前 star 数达到了 30K 这套互…

POE指数积公式的简单matlab实现

参考现代机器人学 及机器人工程师进阶之路(八)指数积(PoE)建立机械臂模型及正运动 1.使用Robotics在matlab中建立一个简单的机械臂,方便验证后面的代码写的对不对 %Robotics 工具箱介绍: https://blog.csd…

【使用secureCRT管理Linux系统】

使用secureCRT管理Linux系统 进入secureCRT快速连接虚拟机 默认是SSH2类型,红线是虚拟机的ip地址,绿线是虚拟机的用户名称 如果之后的页面出现了需要输入用户密码,那就是成功了,如果出现了Connection timed out 可能原因是电脑…

Spring如何整合MyBatis框架?使用XML及java类的配置方式

前言 Spring文章链接: 从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…

文华财经期货日内多空金叉波段彩带幅图指标公式,震荡区间决策预警信号指标公式

​期货指标公式不是交易的圣杯,也不是期货亏损后的救命稻草。请理性运用指标公式,独立决策,盈亏自负。 1.在期货交易中,大部分品种,大部分时间都是在走一个趋势行情。即使是形态内的震荡行情,也是在走一个…

redis 实现延迟队列及其他实现延迟队列

1、 前言 1.1、什么是延迟队列? 延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延迟时间,表示其希望能够在经过该指定…

虹科新品|HK-Edgility敏捷边缘计算套件

敏捷、经济高效且易于管理大规模IT服务基础设施 业务动态和数字化转型将业务资源和业务用户都推到了传统 IT 边界之外。业务资源和服务被虚拟化并迁移到云端。随着数字工作空间的发展和业务用户需要随时随地访问业务资源,越来越多的业务资源被推向网络边缘。 由于…

研报精选230216

目录 【行业230216东吴证券】环保行业月报:2023M1环卫新能源渗透率大增至11.91%,上海地区渗透率高达77%【行业230216国元证券】国元新食饮:一图君:22年白酒产量:同降6.2%【行业230216浙商证券】农林牧渔点评报告&#…

认识数据库

今天为大家带来数据库的知识 🚀1.什么是数据库 🚀2.数据库的分类 🚀3.数据库的存储 1.首先来聊一聊MySQL数据库的定义 已经学习了数据结构 数据结构是一门研究数据如何存储的学科,当数据是少量的时候,用数据结构…

在vue2使用百度脑图的kityminder-core进行二次开发思维导图,给节点绑定数据后添加新的图标

需求说明:在给某个节点绑定文件数据后,用户并不能一眼看出哪个节点上绑定了数据,因此需要在绑定文件数据后给节点上加一个图标用于标识。 添加图标 1、在kityminder-core/src/module/file.js文件中添加代码 (file.js文件如何添加…

ChatGPT国内镜像站初体验:聊天、Python代码生成等

ChatGPT国内镜像站试用,聊天、Python代码生成。 (本文获得CSDN质量评分【92】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… …

基于离散时间频率增益传感器的P级至M级PMU模型的实现(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…