什么是布隆过滤器

布隆过滤器实质上是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

结构特点

布隆过滤器实际上是一个bit数组,数组的每一位只有0,1两种值,通过将一个key进行多次不同的hash生成多个hash值,然后储存在bit数组中;当判断某个key是否存在时,将key进行多次hash,在bit数组中查询多个hash值是否存在,当多个hash值的查询结果都为1时,则该key可能存在,注意仅仅是【可能存在】,因为可能有其他的key也映射到了相同的位置,若存在查询结果为0的hash值,则该key【一定不存在】

优缺点

当bit数组长度过小时,计算hash值存放的位置很大概率会发生重叠,则误判的几率增大
当bit数组长度过大时,误判几率小,但是可能导致内存空间占用过大,空间换时间性价比低

实践

redis 的 setbit 和 getbit 就可以实现布隆过滤器,但当存储的值的很大时,占用的内存空间会非常大;
例如

setbit mytest 1000000000 1
> result 0    
strlen mytest 
> 125000000 (byte)
setbit mytest 1000000001 1
> result 0    
strlen mytest 
> 125000001 (byte)
setbit ljtest 2000000015 1
> result 0    
strlen mytest 
> 250000002 (byte)

由此可见,redis 中 setbit key 的长度 = (max value / 8) + 1

引申

  • setbit key offset value
    bitmap偏移量设置
    例如 setbit myTestKey 1 1; 意义为在偏移量为1的位置,设置值为1
    例如 setbit myTestKey 99 1; 意义为在偏移量为99的位置,设置值为1,所占大小为 99bit = 12.375byte
  • bitcount key
    查询所有被设值为1的offset的数量
  • bitcount key start end
    查询所有被设值为1的,且 start8 <= offset <= (end+1)8 的数量

老污的猫
30 声望5 粉丝

« 上一篇
哈希表