Hello World

布隆过滤器

一. 概念

  布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。

  当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在

  打个比方,当它说不认识你时,肯定就不认识;当它说见过你时,可能根本就没见过面,不过因为你的脸跟它认识的人中某脸比较相似,所以误判以前见过你。

二. Redis中布隆过滤器的安装

  Redis 官方提供的布隆过滤器到了 Redis 4.0 提供了插件功能之后才正式登场。布隆过滤器作为一个插件加载到 Redis Server 中,给 Redis 提供了强大的布隆去重功能。 下面我们来体验一下 Redis 4.0 的布隆过滤器,为了省去繁琐安装过程,我们直接用 Docker 吧。

  > docker pull redislabs/rebloom # 拉取镜像

  > docker run -p6379:6379 redislabs/rebloom # 运行容器

  > redis-cli # 连接容器中的 redis 服务.

  如果上面三条指令执行没有问题,下面就可以体验布隆过滤器了。

三. 基本使用

3.1 添加一个元素

  bf.add key value

3.2 添加多个元素

  bf.madd key value1 value2 value3

3.3 查询一个元素

  bf.exists key value

3.4 查询多个元素

  bf.mexists key value1 value2 value3

四. 布隆过滤器的创建

4.1 参数设置

  bf.reserve 指令显式创建。如果对应的 key 已经存在,bf.reserve会报错。

  bf.reserve 有三个参数,分别是 key, error_rateinitial_size

  error_rate 参数表示错误率。错误率越低,需要的空间越大。

  initial_size 参数表示预计放入的元素数量,当实际数量超出这个数值时,误判率会上升。

4.2 默认设置

  它在我们第一次 add 的时候自动创建。

  默认的error_rate0.01,默认的initial_size100

五. 基本原理

  每个布隆过滤器对应到 Redis 的数据结构里面就是一个大型的位数组和几个不一样的无偏 hash 函数。所谓无偏就是能够把元素的 hash 值算得比较均匀

  向布隆过滤器中添加 key 时,会使用多个 hash 函数对 key 进行 hash 算得一个整数索引值然后对位数组长度进行取余运算得到一个位置,每个 hash 函数都会算得一个不同的位置。再把位数组的这几个位置都置为 1 就完成了 add 操作。

  向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的几个位置都算出来,看看位数组中这几个位置是否都为 1,只要有一个位为 0,那么说明布隆过滤器中这个 key 不存在。如果都是 1,这并不能说明这个 key 就一定存在,只是极有可能存在,因为这些位被置为 1 可能是因为其它的 key 存在所致。

  如果这个位数组比较稀疏,判断正确的概率就会很大,如果这个位数组比较拥挤,判断正确的概率就会降低。

 

posted @ 2018-10-15 12:42  小小忧愁米粒大  阅读(668)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书