什么是布隆过滤器
布隆过滤器实质上是一种数据结构,比较巧妙的概率型数据结构(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 的数量
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。