深入了解布隆过滤器:数据筛选的利器

简介: 深入了解布隆过滤器:数据筛选的利器

一、什么是布隆过滤器

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


布隆过滤器的特点:


  • 如果布隆过滤器判断元素在集合中存在, 不一定存在.
  • 如果布隆过滤器判断不存在, 则一定不存在.


二、布隆过滤器的原理

当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。


简单来说就是准备一个长度为 m 的位数组并初始化所有元素为 0,用 k 个散列函数对元素进行 k 次散列运算跟 len (m) 取余得到 k 个位置并将 m 中对应位置设置为 1。当布隆过滤器保存的元素越多,被置为 1 的 bit 位也会越来越多,元素 x 即便没有存储过,假设哈希函数映射到位数组的三个位都被其他值设置为 1 了,对于布隆过滤器的机制来讲,元素 x 这个值也是存在的,也就是说布隆过滤器存在一定的误判率。


三、底层数据结构

布隆过滤器由一个BitMap组成。所谓的BitMap,本质上就是一个数组。与寻常数组不同的是,BitMap一个数组元素占一个bit,这一特性决定了BitMap能够极大地节省空间

在位图的场景下使用多个哈希函数来降低冲突即就是布隆过滤器的思想,其最大的特点就是:对一个对象使用多个哈希函数。其查询有个特点,就是即使任何两个元素的哈希值不冲突,查询对象的K个位置的值都是1,查询结果为存在,这个结果也可能是错误的,这就是布隆过滤器的容错率。



使用布隆过滤器可以快速检索是否存在,但是当哈希函数特别多的时候,容错率会增大,因此也要控制哈希函数的个数。计算哈希函数个数的数学公式:哈希函数K=(m/n)*In(2).其中m是bit数组长度,n为要存入对象的个数。【实际上,当哈希函数个数为1,且数组长度足够,布隆过滤器就可以退化成一个位图。位图是只有一个特殊的哈希函数,且没有被压缩长度的布隆过滤器】


四、使用场景

布隆过滤器常见的应用场景如下:

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


五、布隆过滤器删除

对于布隆过滤器无法直接删除,但也有带引用计数的布隆过滤器,存的不是0和1,而是一个计数。所有的设计都是一个trade-off(权衡取舍)。


为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。布谷鸟过滤器用更低的空间开销解决了布隆过滤器不能删除元素的问题,做到了更好的效果:


  • 支持动态的添加和删除元素
  • 提供了比传统布隆过滤器更高的查找性能,即使在接近满的情况下(比如空间利用率达到 95% 的时候)
  • 比起商过滤器它更容易实现
  • 如果要求误判率低于3%,它比布隆过滤器有更低的空间开销


相关文章
|
10天前
|
存储 缓存 NoSQL
京东面试:亿级黑名单 如何设计?亿级查重 呢?(答案含:布隆过滤器、布谷鸟过滤器)
尼恩,40岁的老架构师,近期在读者交流群中分享了几个大厂面试题及其解决方案。这些问题包括亿级数据查重、黑名单存储、电话号码判断、安全网址判断等。尼恩给出了三种解决方案:使用BitMap位图、BloomFilter布隆过滤器和CuckooFilter布谷鸟过滤器。这些方法不仅高效,还能显著提升面试表现。尼恩还建议大家系统化学习,刷题《尼恩Java面试宝典PDF》,并提供简历修改和面试辅导,帮助大家实现“offer自由”。更多技术资料和PDF可在公众号【技术自由圈】获取。
|
2月前
|
存储 NoSQL Redis
17)使用布隆过滤器从海量数据中查询一个值是否存在
17)使用布隆过滤器从海量数据中查询一个值是否存在
39 0
|
3月前
|
缓存 监控 前端开发
大量数据如何做分页处理
【8月更文挑战第13天】面对大量数据分页,可从数据库与应用两方面着手:数据库端利用内置分页功能如MySQL的`LIMIT`与`OFFSET`,及SQL Server的`ROW_NUMBER()`;优化查询,精选字段并为常用排序字段加索引。应用端采用缓存已分页数据、异步加载新页及前端懒加载技术。同时限制最大页数并持续监控优化性能,确保高效查询与良好用户体验。
|
5月前
|
XML 监控 大数据
基于Guava布隆过滤器优化海量字符串去重策略
**Guava Bloom Filter实践:** 在大数据场景下,利用布隆过滤器进行高效字符串去重。Guava提供易用的BloomFilter实现,通过添加Guava依赖,设定预期元素数和误报率来创建过滤器。尽管可能产生误报,但不会漏报,常用于初期快速判断。添加元素,使用`mightContain`查询,若可能存在,再用精确数据结构确认。优化涉及选择哈希函数、调整误报率和避免重复添加。
|
5月前
|
存储 算法 安全
基于Guava布隆过滤器的海量字符串高效去重实践
基于Guava布隆过滤器的海量字符串高效去重实践
|
6月前
|
SQL 存储 关系型数据库
深分页怎么导致索引失效了?提供6种优化的方案!
深分页怎么导致索引失效了?提供6种优化的方案!
|
6月前
|
分布式计算 JavaScript 前端开发
给大家讲讲过滤查询的思路(一点就通)
给大家讲讲过滤查询的思路(一点就通)
56 1
|
6月前
|
存储 搜索推荐 NoSQL
用户画像系列——布隆过滤器在策略引擎中的应用
用户画像系列——布隆过滤器在策略引擎中的应用
70 0
|
6月前
|
存储 缓存 NoSQL
🍻带你一起来理解布隆过滤器,带图分析~
🍻带你一起来理解布隆过滤器,带图分析~
104 0
|
12月前
|
缓存 算法 Java
亿级数据过滤算法----布隆过滤器
亿级数据过滤算法----布隆过滤器