小白日更第八十一天->布隆过滤器

关于布隆过滤器,小伙伴们不要觉得很难,其实这个东西原理还是很简单的。

原理

布隆过滤器其实就是一个很长的bit数组,里面的每一个数组下标初始为0.当我们向布隆过滤器中添加一个元素的时候,会经过hash算法,来定位一下这个数据对应的数组下标是多少,但是很容易想到的是一个hash函数可能产生hash冲突的概率比较大,那我们极端一点,每个数据我都让他经过100次hash函数,其实我个人觉得,这样产生的hash冲突的概率虽然很小很小了,但是有一个问题,就是时间问题,经过一次hash可能会产生较多的冲突,但是hash的时间很快。如果经过100次hash,确实我们可能已经把hash冲突的概率降低到很小很小了,但是我们会耗费大量的时间在hash算法上。这里我想到一个例子,就是CurrentHashmap,在1.7的时候采用分段锁,分段锁是用segement表示的,这个segement继承了Reentrantlock,我们在对一个数据做操作的时候,就会经过两次hash,一次先确定锁的位置,然后再确定我们要操作的数据的位置,这样就可以同时对segement个位置的元素同时进行操作了,这就是大概的流程。显然经过两次hash运算是比较耗时的,所以1.8的时候CurrentHashmap就摒弃了这种分段锁的做法,而是大量采用Synchronized+CAS操作,来实现并发安全的问题。因为Synchronized在1.6以后是进行了优化的性能不一定比Reentrantlock要慢.其实这部分就是我临时想到这里了,给小伙伴们做一个简单的拓展,这招尤其适用于面试,当面试官问我们一个问题的时候,我们联想到另外一个问题,面试官可能就觉得这个小伙子不单单是学习这一个知识点,还有把知识点融会贯通的能力。这不就给面试官留下了好的印象.
还是接着说布隆过滤器,那我们一个数据经过多个hash函数映射到数组的不同位置,对应映射的位置我们把0改为1,代表这个位置是某一个数据经过hash函数映射到这里的.那我们在判断一个数据是否存在的时候,就判断这个数据经过hash函数映射到的数组下标的位置是不是都为1,如果有一个位置为0,就证明这个数据一定不存在.

问题

在这里插入图片描述
先看这样一张图片。数据a,b,c经过三个hash函数映射到bit数组的位置都置为1,也可以看到a和b两个数据在做hash映射的时候产生了一次hash冲突.但是我们现在看这个数据d,我们现在知道这个数据d其实是不存在的,但是我们可以看到d在经过三次hash映射后,对应的数据下标的位置都为1,但是这三个1,分别是a,b,c三个数据的三次映射的结果。所以就会产生一定的误判率,我们知道布隆过滤器的作用就是过滤不合法的请求,也就是说我们在布隆过滤器里面先判断数据是否存在,如果存在再去缓存里面查找。但是就可能出现数据d这种情况,产生误判了。但是我们看数据e,经过三次hash映射,我们发现有一个位置为0.那我们就可以斩钉截铁的说,**数据e根本不存在!**那我们就大可比必再去缓存中查找,找也找不到,浪费时间,浪费生命。直接返回给用户,告诉用户没有这条数据就可以了。但是由于会产生一定的误判率,随意还是会过滤不掉一些非法请求。所以有一定概率还是会造成缓存穿透的问题.

问题解决

我们分析了问题出在了哪里,就是数据d经过hash运算后,于a,b,c都产生了hash冲突。那我们就可以增加hash函数,从而达到减小hash冲突的概率,间接的达到降低误判率的这么一种情况。
其实我们还可以增加bit数组的长度。假设数组的长度无限长,那产生hash冲突的概率也很小,从而也间接的达到了减小误判率的目的。
其实布隆过滤器本来就是一种以空间来换时间的这么一种想法的实现吧。
对于我们计算机,空间也就是内存吧,我个人理解的不知道对不对,还有对于我们程序来说重要的是响应时间,这两个点都很重要,那布隆过滤器就是牺牲了空间,来达到快速判断一个数据是不是在海量数据中是否存在这样的一个目的.

应用的场景

1、可以在解决缓存穿透问题中,当作不合法数据的过滤器,在缓存前面加一层布隆过滤器,减少一定的由于用户的不合理请求导致的数据库压力增大.比如用户一直访问-10000到-1之间的数据id,虽然布隆过滤器有一定的误判率,但是不至于-10000到-1的数据都打到数据库上,一定会过滤掉-10000到-1之间的很多数据,这样不就给我们的数据库减小了不少的压力.

2、黑名单:比如邮件黑名单过滤器,判断邮件地址是否在黑名单中

3、网络爬虫:判断某个URL是否已经被爬取过

以上就是我对布隆过滤器的理解,早上起来还有点懵,文中有理解错误的地方希望小伙伴们指正~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值