Redis之布隆过滤器

定义

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

原理

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

0 0 0 0 0 0 0 0
下标 0 1 2 3 4 5 6 7

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

1 0 0 0 1 0 0 1
下标 0 1 2 3 4 5 6 7

至此,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转换为二进制数可以想象成哈希函数的映射过程)
现有一个数组模拟一下布隆过滤器

1 1 0 0 0 0 0 0
0 1 2 3 4 5 6 7

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

你可能感兴趣的:(redis)