点击上方 IT牧场 ,选择 置顶或者星标
技术干货每日送达
布隆过滤器到底是个啥东西?
布隆过滤器是一个不怎么精确的Set集合,当你使用它的 contains 方法判断某 个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。
当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存 在。打个比方,当它说不认识你时,肯定就不认识;当它说见过你时,可能根本就没见过 面,不过因为你的脸跟它认识的人中某脸比较相似 (某些熟脸的系数组合),所以误判以前见过你。
布隆过滤器能准确过滤掉那些已经看过的内容,那些没有看过 的新内容,它也会过滤掉极小一部分 (误判),但是绝大多数新内容它都能准确识别。这样就 可以完全保证推荐给用户的内容都是无重复的。
安装
redis目前最新版本是6.0,Bloom Filter 作为一个modules来运行,安装也非常简单
part1:自己下载源码编译安装
下载代码库https://github.com/RedisBloom/RedisBloom#building-and-loading-redisbloom
执行 make 命令进行编译,产出文件 redisbloom.so
执行命令 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
干货分享
最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!
•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论
近期热文
•LinkedBlockingQueue vs ConcurrentLinkedQueue•解读Java 8 中为并发而生的 ConcurrentHashMap•Redis性能监控指标汇总•最全的DevOps工具集合,再也不怕选型了!•微服务架构下,解决数据库跨库查询的一些思路•聊聊大厂面试官必问的 MySQL 锁机制
关注我
喜欢就点个"在看"呗^_^