一.介绍与原理  

在我们开发过程中,避免不了经常使用到redis这个缓存中间件,尤其是在大并发访问量的时候,他的存在会让我们在对数据库操作时节省很大的性能。

  然而当我们进行redis的使用时,难免不了会发生以下这三种redis搞崩数据库的情况:缓存击穿、缓存穿透、缓存雪崩。而在遇到这几种情况时,我们都要有对应的解决措施去防止他的发生。今天我要记录的就是redis modle中的一种非常实用的解决缓存穿透的利器——布隆过滤器(bloomFilter)。

  何为布隆过滤器呢?他的定义的使用定义很简单,即可以用于检索一个元素是否在一个集合中。并且他的检索效率在大数据量访问时远远超过了所有其他算法。他的原理是:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。说简单点就是:将元素hash值转换成byte数组中的多个位置,并把他们置为1,当我们要查询某个元素时,只要拿他的hash值,去转成byte数组对应的所有位置,如果有一个为0,则被检查的元素一定不存在。

二.使用布隆过滤器解决缓存穿透

  原理简单介绍完了,那它的使用场景呢?其实它最经典的使用场景就是在解决缓存穿透。先介绍一下缓存穿透,当一个不存在redis的id对系统进行请求时,redis判断该id不存在,就会去数据库进行查询该id是否有对应数据,如果有人利用这点进行恶意攻击,那么同时用该id不断进行大量请求数据库,则就会绕过redis对数据库造成很大压力甚至崩溃。

  而当我们使用布隆过滤器时,我们只要对布隆过滤器进行初始化,将数据库的数据全都先载入到布隆过滤器中。这样操作后,当一个不存在的id再次进行请求时,在经过过滤器时,过滤器比较id转换成的hash值对应的byte数组位置,立刻就能发现该id不存在,直接返回空即可,速度几乎快到忽略不计。这样即可完美解决缓存穿透的问题。

三.布隆过滤器的缺点

  有人会问,既然布隆过滤器那么牛,那么怎么不用在别的场景呢。那是因为他也有一些不可忽略的缺点:1.会存在误判,因为当要查到的元素并没有在容器中,但是刚好hash之后得到的k个位置上值都是1,那就过滤器就会通过,所以使用它的场景需要允许一定非常小概率的误差。2.删除困难,通过原理可知,在删除时,不能随便就修改byte数组的置1值,因为你无法确定那个位置的1是不是只有你这个值在使用,修改了就很可能会影响别的值。

四.布隆过滤器的在springboot的运用配置

方法一:

在cn.hutool的包下有一个封装好的AbstractFilter,他实现了BloomFilter这个接口,里面包含两个方法,一个判断是否包含指定值的boolean contains(String var1)方法,一个添加值boolean add(String var1);的方法,通过这两个方法,我们就可以对布隆过滤器进行添加id和判断id是否存在。对应的包如下:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.2</version>
</dependency>

方法二:

  大家可参考该文章进行配置和使用(Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六_小目标青年的博客-CSDN博客  (转载自小目标青年

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐