redis之布隆过滤器

由来

  情景:当我们使用新闻客户端看新闻时,他会不断推送新的内容,他每次推荐时都要去重,那么问题来了,客户端如何实现推送去重呢?
  当然不会采用记录用户看过的内容,第一数据量大,第二不断exists消耗性能太多。缓存也不行,时间久了数据量太大。
  这个时候布隆过滤器出现了。

什么是布隆过滤器

  这是一个不怎么精确地set结构,当你使用它的contains方法判断某个数据是否存在时,他可能误判,布隆过滤器是不精确的。只要参数设置合理,那么其精确度是可控的。其判断一个值存在时,其可能不存在,判断一个值不存在时,那么一定不存在。

用法

  bf.add 添加元素,bf.exists,查询元素是否存在,其用法和set集合差不多,批量命令是bf.madd指令,批量查询则是bf.mexists指令。我们创建的布隆过滤器都是默认的过滤器,在我们第一次add的时候自动创建。,但是为了提供高精确率。我们可以用bf.reserve指令来修改其参数即可。第一个为其名字,第二个为
client.createFilter(“codehole”, 50000, 0.001);第二个参数为预计存放数据量,第三个为误差率。误差率越低,需要空间越大。

实现原理

  底层是一个大型的位数组,和几个无偏的hash函数(无偏就是让hash值分布均匀)。添加值的时候,会用多个hash函数对key进行hash运算,然后对应数组上不同点,再把这些点全部置为1。询问key是否存在时,和add一样,也是用hash算法吧这些位置都计算出来,看看是否都为1,只要有一个为0,那么这个值不存在。当然如果都是1,也不一定都存在,可能是其他计算的点正好都覆盖了。