Redis缓存穿透+解决(布隆算法)

一 Redis缓存穿透

缓存穿透是怎么发生的?查询的数据在缓存数据库中没有命中,从而需要到数据库中寻找。
如果缓存穿透只是偶尔发生, 那么无伤大雅,但是如果有人恶意攻击呢?
假设这样一种场景:根据订单编号查询,系统的编号规则是从1开始,但是黑客故意输入-1等不可能命中的数据呢?那么必然会发生缓存穿透,如果发生大量诸如此类的恶意穿透,就会给数据库造成极大的压力,甚至崩溃。

二 解决方法

2.1 增加无意义热点数据

即使查到的值为空,也将数据对保存进热点数据,但是这么做不仅会造成缓存中无意义数据增加,也不能从根本解决缓存穿透的问题。

2.2 增加过滤器

在发生没有命中热点数据的情况时,先经过一段过滤器将不符合条件的数据过滤掉。但随着数据量增加,过滤器需要过滤的数据也在增加,过滤器会越来越大,且过滤操作也是需要时间的,性能也会打折扣。

2.3 布隆过滤器

同样是过滤器的思路,只不过是使用布隆算法去过滤

三 布隆算法

实际上是一种提高效率,保留一定错误率的算法。
例如:每个写入的数据都打上标记,使用hash算法将数据映射到对应的bit位,将相应bit位修改为1,bit位数可以由自己定,那么当查询数据时,同样使用这个操作,如果映射到的位置是0,说明该数据不在数据库中,就不去麻烦数据库了。
为什么说会有一定的错误率呢?因为根据hash算法,即使不同的数据也可能被映射到相同的位置,产生hash碰撞,就是说,即使数据不存在,根据这个算法也可能会映射到1的bit位。
优化方案也很简单,第一:增加bit位,减少hash碰撞概率。第二:就是对一个数据使用多种不同的hash算法分别映射到多个位置,查询数据时也一样,只有多个位置同时被命中才说明这个数据存在于数据库,才能去麻烦数据库

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/124268929