Redis:布隆过滤器

很庆幸redis4.0之后就内置布隆过滤器了;redis

127.0.0.1:6379> BF.ADD bloomWall user1
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user2
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user3
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall  user2
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall  user4
(integer) 0
127.0.0.1:6379>
复制代码

布隆过滤器

使用场景

  • 大流量场景:避免缓存穿透;只返回在布隆过滤器中出现过的相关数据,避免大量请求直接打到数据库服务上
  • e.g:用户识别,有的不必定有(存在偏差),没有的就是没有

原理

  • 存储:S集合中有n个元素,利用k个哈希函数,将S中的每一个元素映射到一个长度为m的位(bit)数组B中不一样的位置上,这些位置上的二进制数均置为1
  • 过滤:检测的元素通过这k个哈希函数的映射后,发现其k个位置上的二进制数不全是1,那么这个元素必定不在集合S中,反之,该元素多是S中的某一个元素
  • 计算函数k值:为了估算出k和m的值,在构造一个布隆过滤器时,须要传入两个参数,便可以接受的误判率fpp和元素总个数n(不必定彻底精确)。
  • 哈希函数的要求尽可能知足平均分布,这样既下降误判发生的几率,又能够充分利用bit数组的空间;
  • 公式:;

优点

  • 空间:
  • 效率:
相关文章
相关标签/搜索