暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

布隆过滤器到底是个啥东西?

Coding小暮 2020-10-18
305

 点击关注Coding小暮,获取更多优质内容哦

布隆过滤器到底是个啥东西?

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

        当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存 在。打个比方,当它说不认识你时,肯定就不认识;当它说见过你时,可能根本就没见过 面,不过因为你的脸跟它认识的人中某脸比较相似 (某些熟脸的系数组合),所以误判以前见过你。
        布隆过滤器能准确过滤掉那些已经看过的内容,那些没有看过 的新内容,它也会过滤掉极小一部分 (误判),但是绝大多数新内容它都能准确识别。这样就 可以完全保证推荐给用户的内容都是无重复的。

安装

redis目前最新版本是6.0,Bloom Filter 作为一个modules来运行,安装也非常简单

part1:自己下载源码编译安装

  1. 下载代码库https://github.com/RedisBloom/RedisBloom#building-and-loading-redisbloom
  2. 执行 make 命令进行编译,产出文件 redisbloom.so
  3. 执行命令 redis-server --loadmodule /path/to/redisbloom.so 此时指定的 redisbloom.so必须是绝对路径,启动redis

part2:docker直接运行

> docker pull redislabs/rebloom # 拉取镜像
> docker run -p6379:6379 redislabs/rebloom # 运行容器 
> redis-cli # 连接容器中的 redis 服务

命令

BF.RESERVE
bf.reserve name initCapacity  _errorRate
      创建命令,该命令有三个参数,initCapacity 初始化长度,errorRate 期望的错误率,错误率越小需要的存储空间就越大,对于不需要过于精确的场合,error_rate 设置稍大一点也无伤大雅。
BF.ADD
bf.add name val
    就是一个非常简单的add操作,需要批量添加的话需要使用 BF.MADD
BF.EXISTS
    校验元素是否存在,该命令每次只能校验一个,bf.mexists 可以支持批量校验

适用场景

  • 防止缓存穿透,一般情况下,先查询缓存是否有该条数据,缓存中没有时,再查询数据库。当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。缓存穿透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。可以使用布隆过滤器解决缓存穿透的问题,把已存在数据的key存在布隆过滤器中。当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在该条数据直接返回;如果存在该条数据再查询缓存查询数据库。
  • 推荐系统给用户推荐新闻,避免重复推送。
  • 邮件服务器中标记为广告邮箱的发件人
  • .....

工作原理


bloomFilter就是一个字节数组,多个hash函数对当前的value进行hash运算,得到一个整数索引值,然后把这个索引位置上设置为1,就完成了add






      老夫准备了一下java学习资料,就在我的公众号里。少侠可以关注我的公众号在底部点击学习资料便可以免费获取了。祝少侠早日练就一身本领,行侠仗义、前程似锦。




文章转载自Coding小暮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论