5 分钟搞懂布隆过滤器,过滤亿级数据

2020-01-07 05:27:59 来源:网络

在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题。

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难

一、布隆过滤器简介

当你往简单数组或列表中插入新数据时,将不会根据插入项的值来确定该插入项的索引值。这意味着新插入项的索引值与数据值之间没有直接关系。这样的话,当你需要在数组或列表中搜索相应值的时候,你必须遍历已有的集合。若集合中存在大量的数据,就会影响数据查找的效率。

针对这个问题,你可以考虑使用哈希表。利用哈希表你可以通过对 “值” 进行哈希处理来获得该值对应的键或索引值,然后把该值存放到列表中对应的索引位置。这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的。


5 分钟搞懂布隆过滤器,过滤亿级数据


根据定义,布隆过滤器可以检查值是 “可能在集合中” 还是 “绝对不在集合中”。“可能” 表示有一定的概率,也就是说可能存在一定为误判率。那为什么会存在误判呢?下面我们来分析一下具体的原因。

布隆过滤器(Bloom Filter)本质上是由长度为 m 的位向量或位列表(仅包含 0 或 1 位值的列表)组成,最初所有的值均设置为 0,如下图所示。


5 分钟搞懂布隆过滤器,过滤亿级数据


为了将数据项添加到布隆过滤器中,我们会提供 K 个不同的哈希函数,并将结果位置上对应位的值置为 “1”。在前面所提到的哈希表中,我们使用的是单个哈希函数,因此只能输出单个索引值。而对于布隆过滤器来说,我们将使用多个哈希函数,这将会产生多个索引值。


5 分钟搞懂布隆过滤器,过滤亿级数据


如上图所示,当输入 “semlinker” 时,预设的 3 个哈希函数将输出 2、4、6,我们把相应位置 1。假设另一个输入 ”kakuqo“,哈希函数输出 3、4 和 7。你可能已经注意到,索引位 4 已经被先前的 “semlinker” 标记了。此时,我们已经使用 “semlinker” 和 ”kakuqo“ 两个输入值,填充了位向量。当前位向量的标记状态为:


5 分钟搞懂布隆过滤器,过滤亿级数据


当对值进行搜索时,与哈希表类似,我们将使用 3 个哈希函数对 ”搜索的值“ 进行哈希运算,并查看其生成的索引值。假设,当我们搜索 ”fullstack“ 时,3 个哈希函数输出的 3 个索引值分别是 2、3 和 7:


5 分钟搞懂布隆过滤器,过滤亿级数据


从上图可以看出,相应的索引位都被置为 1,这意味着我们可以说 ”fullstack“ 可能已经插入到集合中。事实上这是误报的情形,产生的原因是由于哈希碰撞导致的巧合而将不同的元素存储在相同的比特位上。幸运的是,布隆过滤器有一个可预测的误判率(FPP):


5 分钟搞懂布隆过滤器,过滤亿级数据


  • n 是已经添加元素的数量;
  • k 哈希的次数;
  • m 布隆过滤器的长度(如比特数组的大小);

极端情况下,当布隆过滤器没有空闲空间时(满),每一次查询都会返回 true 。这也就意味着 m 的选择取决于期望预计添加元素的数量 n ,并且 m 需要远远大于 n 。

实际情况中,布隆过滤器的长度 m 可以根据给定的误判率(FFP)的和期望添加的元素个数 n 的通过如下公式计算:


5 分钟搞懂布隆过滤器,过滤亿级数据


了解完上述的内容之后,我们可以得出一个结论,当我们搜索一个值的时候,若该值经过 K 个哈希函数运算后的任何一个索引位为 ”0“,那么该值肯定不在集合中。但如果所有哈希索引值均为 ”1“,则只能说该搜索的值可能存在集合中

二、布隆过滤器应用

在实际工作中,布隆过滤器常见的应用场景如下:

  • 网页爬虫对 URL 去重,避免爬取相同的 URL 地址;
  • 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱;
  • Google Chrome 使用布隆过滤器识别恶意 URL;
  • Medium 使用布隆过滤器避免推荐给用户已经读过的文章;
  • Google BigTable,Apache HBbase 和 Apache Cassandra 使用布隆过滤器减少对不存在的行和列的查找。 除了上述的应用场景之外,布隆过滤器还有一个应用场景就是解决缓存穿透的问题。所谓的缓存穿透就是服务调用方每次都是查询不在缓存中的数据,这样每次服务调用都会到数据库中进行查询,如果这类请求比较多的话,就会导致数据库压力增大,这样缓存就失去了意义。

利用布隆过滤器我们可以预先把数据查询的主键,比如用户 ID 或文章 ID 缓存到过滤器中。当根据 ID 进行数据查询的时候,我们先判断该 ID 是否存在,若存在的话,则进行下一步处理。若不存在的话,直接返回,这样就不会触发后续的数据库查询。需要注意的是缓存穿透不能完全解决,我们只能将其控制在一个可以容忍的范围内。

三、布隆过滤器实战

布隆过滤器有很多实现和优化,由 Google 开发著名的 Guava 库就提供了布隆过滤器(Bloom Filter)的实现。在基于 Maven 的 Java 项目中要使用 Guava 提供的布隆过滤器,只需要引入以下坐标:


5 分钟搞懂布隆过滤器,过滤亿级数据


在导入 Guava 库后,我们新建一个 BloomFilterDemo 类,在 main 方法中我们通过 BloomFilter.create 方法来创建一个布隆过滤器,接着我们初始化 1 百万条数据到过滤器中,然后在原有的基础上增加 10000 条数据并判断这些数据是否存在布隆过滤器中:


5 分钟搞懂布隆过滤器,过滤亿级数据


当以上代码运行后,控制台会输出以下结果:

已匹配数量 1000309

很明显以上的输出结果已经出现了误报,因为相比预期的结果多了 309 个元素,误判率为:

309/(1000000 + 10000) * 100 ≈ 0.030594059405940593

如果要提高匹配精度的话,我们可以在创建布隆过滤器的时候设置误判率 fpp:


5 分钟搞懂布隆过滤器,过滤亿级数据


在 BloomFilter 内部,误判率 fpp 的默认值是 0.03:


5 分钟搞懂布隆过滤器,过滤亿级数据


在重新设置误判率为 0.0002 之后,我们重新运行程序,这时控制台会输出以下结果:

已匹配数量 1000003

通过观察以上的结果,可知误判率 fpp 的值越小,匹配的精度越高。当减少误判率 fpp 的值,需要的存储空间也越大,所以在实际使用过程中需要在误判率和存储空间之间做个权衡。

四、总结

本文主要介绍的布隆过滤器的概念和常见的应用场合,在实战部分我们演示了 Google 著名的 Guava 库所提供布隆过滤器(Bloom Filter)的基本使用,同时我们也介绍了布隆过滤器出现误报的原因及如何提高判断准确性。最后为了便于大家理解布隆过滤器,我们介绍了一个简易版的布隆过滤器 SimpleBloomFilter。

原文:https://juejin.im/post/5de1e37c5188256e8e43adfc


,mathtype6.0 5 分钟搞懂布隆过滤器,过滤亿级数据

相关:

黄晓明Angelababy怀二胎!谢霆锋王菲婚期曝光?同样的时间,同样的地点,我们的吃瓜时间又到了,今天娱乐圈好的大瓜还有不好的大瓜都是一堆,昨天关于明道哥哥因为欠债去世的消息已经传遍娱乐圈了,虽然死者为大,但是从人性的角度来说这个男人不太值得同情,自己不想活还要带上孩子老婆。而今天关于这个悲剧的一些细节曝光了,那就是明道哥哥疑似首先给老婆孩子下药导致对方晕了再勒死了以后自己上吊的。所以还是老话,只有会尊重别人生命的人自己的生命才会得到尊重。而接下..

偷偷结婚?演技小花这次真嫁了?临近年关,又快到了一年一度回家被催婚、安排相亲的日子。而在这紧锣密鼓的计划安排中,有网友爆料彭于晏和张钧甯秘密领证结婚了,为了不曝光,婚礼也都是封锁消息的。 ​这样一个惊天大新闻,也自然受到了很多网友的关注。素有“国民老公”之称的彭于晏,一直都没有结婚,已经成为了全民催婚的重点对象,如今被爆出和张钧甯结婚,也是郎才女貌,受到了很多网友的祝福。 ​两人其实早前10年前就已经相识,还一起合作过《蜂蜜幸..

新疆巴音郭楞州若羌县发生3.0级地震 震源深度13千米  中新网1月7日电 据国家地震台网官方微博消息,中国地震台网正式测定:1月7日4时25分在新疆巴音郭楞州若羌县(北纬38.82度,东经88.68度)发生3.0级地震,震源深度13千米。 【编辑:于晓】

地球上石油可供人类开采多少年?2019最新权威数据出炉了2019年12月,美国《油气杂志》(Oil & Gas Journal)发布了2019年全球石油产量和油气储量报告。让我们看看全球石油行业还有多少家底,各大石油生产国如何搅动行业风波,以及行业未来走向如何。石油储产量 家底 生产国博弈共2400字|建议阅读时间4分钟文 | 沐雨 01、全球石油行业家底依然“富足”年年开采,年年有。据2019年各国更新的剩余探明可采储量数据,全球石油储量较上一年稳中有升。石油剩余探明可采储量为2305.8..

钉钉或将进军个人社交,阿里巴巴又瞄准了什么?美股研究社1月6日消息,2020年2月16日与17日在杭州云栖小镇将召开钉钉5周年新品发布会,近日钉钉官方微博放出了几张预热海报,声称要“改名换姓”、“洗心革面”、“干掉自己”、“打破圈层”,引发网友猜测其或将改名、启用新logo,以及进入职场社交。经过5年的发展,阿里钉钉已经成为全球最大智能移动办公平台,截至去年6月30日,其平台用户数量就已突破2亿,企业组织数量也已突破1000万家。一直以来阿里巴巴都可以说拥有一个..

2019移动支付报告出炉:男性多过女性,学历越低,越喜欢用近日,中国支付清算协会在总结往年问卷调查工作经验的基础上,组织成员单位重点针对用户基本属性、用户使用偏好、用户满意度等内容开展延续性调查工作。本次调查共收到153950份有效问卷,经处理分析后,调查结果显示:①2019年,移动支付男性用户多于女性用户,占比与上年基本保持一致;②移动支付用户以中青年群体为主,与其他年龄段用户占比差距缩小;③本科及以下学历和月收入在3000-10000元用户仍是移动支付的主力用户;④移..

快速完成支付宝鼠年集福秘籍还有一个半月左右的时间,2020年支付宝集五福即将开始!鼠年福字活动,如何更快集成呢?一起来了解一下吧。按照往年的时间,预计2020年鼠年集五福的活动大概将在1月15号开始,到大年三十结束,10天左右那么如何快速集成呢?需要了解一下,得到福卡的所有方式:1、AR扫一扫点击扫一扫,切换到AR扫描,就可以扫描“福”字得到福卡啦。2、浇水支付宝的蚂蚁森林里,给好友浇水,也有机会得到福卡。3、答题上答答星球也可以赢福卡。4..

23万特斯拉开卖,国产电动车表示压力很大01一场没有硝烟的战争,开始了!几个小时之前,特斯拉发布了最便宜的特斯拉——“售价35,000美元(约合人民币23.4万元)起的标准版Model 3”。此外,特斯拉的所有车型均降低了售价。更重要的是,特斯拉要关闭线下直营店,全部实行线上销售,可再降6%的售价。并且,支持7天无理由退车。此举一出,国产汽车行业一片哗然。目前,标准版的Model 3已登陆美国特斯拉官网。标准版相比其他更贵、更高配置的车型,并没有太大变化,仅仅..

2020 CES:智能汽车正推开智能社会之门作为一个新十年的开始,2020年CES将开启智能社会的大门,对于什么是智能社会个人见解不同,但无论是智能手机还是智能汽车都是其中的一份子,从万物互联到万物智能,它意味着人类社会的治理模式也将发生深刻变化。以一年一度的时间结点来看CES,进步似乎不大,没有革命性技术的爆发,鲜有让人眼前一亮的突破。事实上技术的进步,是有周期的,当前这一周期尚未结束,是在智能方向上的精耕细作, 是商业落地前的探索阶段。以五年为..

29万的特斯拉“杀死”了谁?1月3日,特斯拉Model3的官降成了2020年中国车市第一件“大事”。此次调价涉及到的标准续航升级版Model 3(包含基础版辅助驾驶功能)起售价由原来的35.58万元降价至32.38万元,降价幅度为3.2万,外加2.475万的新能源补贴,国产Model 3的起售价将跌破30万至29.905万。不过,降价后的Model3也将此前免费安装的充电桩改为8000元的选装配置,实际上Model3的降价幅度并不到3万元。一次不足3万元的降价对于一年内已调价数次的Model3来..