Redis之布隆过滤器

定义

布隆过滤器,是指一个辅助的手段,通过一个类似于按位读或者说是类似数组赋值的方式告诉程序,一个key一定不存在,或者是可能存在

原理

假设一个数字137 将它转换为二进制数为 1000 1001
(将137 转换为二进制数可以想象成哈希函数的映射过程)
现有一个数组模拟一下布隆过滤器 (注意,眼下布隆过滤器,只有这八位,且布隆过滤器的长度和哈希算法会直接影响到判断的效率)

00000000
下标01234567

那么将137标记出来之后数组对应的0、4、7号下标置1

10001001
下标01234567

至此,137的状态被“保存”到布隆过滤器中了

所以当一个数字如3,对应二进制 0000 0011,在布隆过滤器中的下标是6、7号位,6号位的值非1,那么就证明了,3这个数字一定没有被设置过。
当一个数字如9,对应的二进制 0000 1001,在布隆过滤器中的下标是4、7号位,4、7号位的值是1,就不能确定是不是9曾经设置过该布隆过滤器,因为137把9的存在状态位覆盖了,因此9可能存在,也可能不存在。
更好理解的说法就是 比如布隆过滤器第一位是1 那么 任何哈希完了之后 先不管其他位 只要第一位是0 那就一定不存在 因为如果存在 就一定会把第一位置成1

好处

试想一下,如果去判断某个元素是否存在,会使用什么样的方法,从时间复杂度的角度来讲应该是会用到hashmap,但是当元素的量十分巨大,hashmap的空间复杂度也会变得十分巨大,因此,布隆过滤器这样的按位去标记的好处就能体现出来,在一个相对占空间较小的情形下,可以告诉程序,一个元素一定不存在,但是却有着不确定性,因为无法区分是否一定存在。

使用场景
  1. 爬虫url去重,从而降低i/o请求
  2. 如需要过滤黑名单,一定不再黑名单里,就允许链接,和后续操作
如何使用

举一个简单的例子
现用一个数字代替一个IP地址:如192(发挥想象,想象成整个ip的地址)
192 的二进制数对应着 1100 0000 (将192转换为二进制数可以想象成哈希函数的映射过程)
现有一个数组模拟一下布隆过滤器

11000000
01234567

将192对应的0和1号位 置一 就模拟完成了设置黑名单的功能
当下一个请求过来时,可以对将ip地址hash,生成对应的位数,和布隆过滤器(数组)中存的做比对,如果发现0、1位不是1,那么一定不是黑名单中的ip,可以直接做后续操作;若发现0、1位是1,那么可能存在在黑名单中内,需要再进行进一步验证。
以上就是模拟了布隆过滤器的使用过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值