什么是缓存穿透:

        缓存系统的主要作用是存储经常访问的数据,以减少对后端存储系统(如数据库)的访问压力。

        当有一个请求查询数据时,系统首先会在缓存中查找。如果缓存中存在该数据,就直接返回缓存中的数据;如果缓存中没有,就会去数据库等存储系统中查找,并将找到的数据放入缓存中,方便下次查询使用。

        缓存穿透是指客户端请求的数据在缓存中没有,在数据库中也没有。这样的请求每次都会穿透缓存,直接访问数据库,导致数据库承受不必要的查询压力。


缓存穿透产生的原因:

        恶意攻击:攻击者故意构造大量在数据库中不存在的键值去频繁请求,试图拖垮数据库。例如,在一个电商系统中,正常的商品 ID 是 1 - 10000,攻击者发送大量商品 ID 为负数或者超大数值(如 99999999)的查询请求,而这些商品在数据库中并不存在。

        业务逻辑漏洞:代码实现的业务逻辑中可能存在漏洞,导致产生大量缓存中没有,且数据库中也不存在的数据请求。比如,一个根据用户 ID 查询用户信息的功能,在用户 ID 生成规则被错误修改后,可能会产生大量无效的用户 ID 请求,这些请求就会造成缓存穿透。


解决方法:

        缓存空对象:当从数据库查询数据为空时,在缓存中存储一个空对象,并设置较短的过期时间。这样,下次相同的请求到来时,在缓存中就能直接获取空对象,避免再次查询数据库。不过,这种方法可能会导致缓存中存储大量无用的空对象数据,占用缓存空间。

        布隆过滤器(Bloom Filter):布隆过滤器主要是用于检索一个元素是否在一个集合中。可以使用Redisson实现的布隆过滤器。它的底层原理是,先初始化一个比较大的数组,里面存放的是二进制0或1。一开始都是0,当一个key来了之后,经过3次hash计算,模数组长度找到数据的下标,然后把数组中原来的0改为1。这样,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。当然,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%。其实这个误判是必然存在的,要不就得增加数组的长度。5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。

        

        



点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论