可以把布隆过滤器理解为一个不怎么精确的set结构,当你使用它的contains方法判断某个对象是否存在时,他可能会误判,但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度也是可以得到控制的,只会有小小的误判率。
当过滤器说某个值存在时,这个值可能不存在,当他说某个值不存在时,那就肯定不存在的,这个是由于它的存储方式决定的。
# 安装redis布隆过滤器插件(4.0之后)
docker pull redislabs/rebloom
docker run -p6379:6379 redislabs/rebloom
docker exec -it loving_meitner redis-cli
bf.add key member
bf.exists key member
bf.madd key member1 member2 ...
bf.mexists key member1 member2 ...
每个过滤器对应到redis里面就是一个大型的位数组和几个不一样的hash函数,当我们往过滤器中添加key时,会使用多个hash函数对key进行hash,得到一组索引值,然后将这个索引值与数组长度进行取模运算得到最终在数据上的位置,然后将对应的位置置为1,就完成了add操作。
过滤器询问key是否存在时,也是通过相同运算得到一组索引位置,然后判断这些位置上的bit位是不是全是1 ,如果全1,则说明有可能存在,因为这些位置置为1有可能是被其他的key设置的,如果数组长度比较短,这个概率就会比较大,所以尽量不要让过滤器中的元素超过预置大小。
※:布隆过滤器的err_rate设置的越小,需要的存储空间就越大,所以不需要太精确的判断的业务场景下,建议不要设置的太小。