前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >布隆过滤器原理及应用场景分析_布隆过滤器 数据更新怎么办

布隆过滤器原理及应用场景分析_布隆过滤器 数据更新怎么办

作者头像
全栈程序员站长
发布于 2022-11-08 09:26:52
发布于 2022-11-08 09:26:52
1K0
举报

https://www.cnblogs.com/qdhxhz/p/11237246.html

开发一个电商项目,因为数据量一直在增加(已达亿级),所以需要重构之前开发好的秒杀功能,为了更好的支持高并发,在验证用户是否重复购买的环节,就考虑用布隆过滤器。

也顺便更加深入的去了解下布隆过滤器的原理,感觉还是蛮有意思的,这一连串的公式不静下心来思考,很容易被绕晕。

一、概述

1、什么是布隆过滤器

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,特点是高效地插入和查询。根据查询结果可以用来告诉你 某样东西一定不存在或者可能存在 这句话是该算法的核心。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的,同时布隆过滤器还有一个缺陷就是

数据只能插入不能删除

2、数据如何存入布隆过滤器

布隆过滤器是由一个很长的bit数组和一系列哈希函数组成的

数组的每个元素都只占1bit空间,并且每个元素只能为0或1。

布隆过滤器还拥有k个哈希函数,当一个元素加入布隆过滤器时,会使用k个哈希函数对其进行k次计算,得到k个哈希值,并且根据得到的哈希值,在维数组中把对应下标的值置位1。

判断某个数是否在布隆过滤器中,就对该元素进行k次哈希计算,得到的值在位数组中判断每个元素是否都为1,如果每个元素都为1,就说明这个值在布隆过滤器中。

3、布隆过滤器为什么会有误判

当插入的元素越来越多时,当一个不在布隆过滤器中的元素,经过同样规则的哈希计算之后,得到的值在位数组中查询,有可能这些位置因为其他的元素先被置1了。

所以布隆过滤器存在误判的情况,但是如果布隆过滤器判断某个元素不在布隆过滤器中,那么这个值就一定不在

如果对布隆过滤器的概念还不是很理解的话,推荐一篇博客,图文并茂好理解很多。详解布隆过滤器的原理、使用场景和注意事项

4、使用场景

  • 网页爬虫对URL的去重,避免爬去相同的URL地址。
  • 垃圾邮件过滤,从数十亿个垃圾邮件列表中判断某邮箱是否是杀垃圾邮箱。
  • 解决数据库缓存击穿,黑客攻击服务器时,会构建大量不存在于缓存中的key向服务器发起请求,在数据量足够大的时候,频繁的数据库查询会导致挂机。
  • 秒杀系统,查看用户是否重复购买。

二、实际应用场景

背景 现在有个100亿个黑名单网页数据,每个网页的URL占用64字节。现在想要实现一种网页过滤系统,可以根据网页的URL判断该网站是否在黑名单上,请设计该系统。

需求可以允许有0.01%以下的判断失误率,并且使用的总空间不要超过200G。

这里一共有4个常量:

100亿条黑名单数据每条数据占64个字节,万分之一的失误率总空间不要超过200G

如果不考虑不拢过滤器,那么这里存储100亿条数据就需要 100亿 * 64字节 = 596G 显然超过300G

解题 在满足有 100亿条数据 并且允许 万分之一的失误率 的布隆过滤器需要多大的bit数组呢?

  • 设bit数组大小为m,样本数量为n,失误率为p。
  • 由题可知 n = 100亿,p = 0.01%

布隆过滤器的大小m公式

求得 m = 19.19n,向上取整为 20n。所以2000亿bit,约为186G。

算完m,我们顺便来算下m,n已知,这时满足最小误差的k是几个。

哈希函数的个数k公式

求得 k = 14,即需要14个哈希函数。

通过通过 m = 20n, k = 14我们再来算下真实的失误率。

布隆过滤器真实失误率p公式

求得 p = 0.006%,即布隆过滤器的真实失误率为0.006%。

通过布隆过滤器公式也可以看出:

单个数据的大小不影响布隆过滤器大小,因为样本会通过哈希函数得到输出值

就好比上面的 每个网页的URL占用64字节 这个数据大小 跟布隆过滤器大小没啥关系。

这三个公式就是有关布隆过滤器已经推倒出的公式,下面我们来推下这个公式是如何推导出来的。

三、公式推导

讲公式,应该先知道几个关键的常量。

误判率p布隆过滤器长度m元素个数n哈希函数个数k

我们再来一步一步由简单到难推导公式。

1、误差率公式推导

前提条件:就是假设每个元素哈希得到的值分布到m数组上的每一个数组节点的概率是相等的。

1) 假设布隆过滤器长度为m,元素个数n为1,哈希函数个数k也为1。那么在插入时某一数组节点没有被置为1的概率。

这个应该很好理解。

2)如果上面其它不变,而哈希函数个数变成k个,那么在插入时某一数组节点没有被置为1的概率。

好理解!

3)如果元素个数变成n个,而哈希函数个数变成k个,那么在插入时某一数组节点没有被置为1的概率。

4)从上面推导出的是: 当布隆过滤器长度为m,元素个数变成n个,哈希函数个数变成k个的时候,某一节点被置为1的概率为

到这里应该也好理解,第三步是该位置从未被置为1,那么1去减去它就是至少有一次被置为1,那么只要存在一次被置1,那么该位置的bit标示就是1,因为布隆过滤器是不能删除的。

5)这个还需要考虑到,一个元素通过hash会生成多个k,放入m数组中,所以需要这k个值都为1才会认为该该元素已经存在。所以是这样的。

上面这个公式推导在转换下就成了

思考 为什么上面这个公式的值就是最终的误差率?

因为当一个布隆过滤器中不存在的元素进来的是的时候,首先通过hash算法产生k个哈希值,分布在m数组上都为1的的概率不就是上面推导出的这个公式吗,那不就是误差吗?

因为明明是不存在的值,却有这个概率表明已经存在。

思考 给定的m和n,思考k值为多少误差会最小

为什么k值的大小不合理会影响误差呢?

我们来思考下,一个元素最终生成k个hash值,那么会在数组m上的k个位置标记为1。

假设k为1,那么每次进来只在m上的某一个位置标记为1,这样的话如果一个新元素进来刚好hash值也在这里,而不用其它位置来判断是否为1,这个误差就会比较大

假设k为m,那么第一个元素进来,在m上所有位置上都表为1了 ,以后只要进来一个元素就会标记为已存在。这个误差也太大了

上面只是举了两个极端的例子,但也说明k值太大、太小都不好,它的最优值一定跟m、n存在某种关系。

至于完整公式的推导,我这里就不在写了,后面会贴一个人家怎么推导的博客。

它们之间的关系只要记住下面这个公式就可以了。

这篇博客就到这里了,后面有整理通过谷歌的guava工具 和 redis 实现布隆过滤器的示例。通过Lua脚本批量插入数据到Redis布隆过滤器

参考

1、详解布隆过滤器的原理,使用场景和注意事项

2、布隆过滤器概念及其公式推导

3、说一说布隆过滤器

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185122.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月6日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理
本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
全栈程序员站长
2022/09/27
4780
布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理
浅析布隆过滤器
布隆过滤器 (Bloom Filter) 是 1970 年由布隆提出的。它可以检索一个元素是否存在于集合中。它的优点是空间效率高,查询时间极快,缺点是有一定的误判率,而且删除困难。
仁扬
2023/06/29
1570
数学之美:布隆过滤器
如果一个黑名单网站包含100亿个黑名单网页,每个网页最多占64B,设计一个系统,判断当前的URL是否在这个黑名单当中,要求额外空间不超过30GB,允许误差率为万分之一。
算法工程师之路
2019/08/05
1.5K0
布隆过滤器原理简介视频_布隆过滤器误判怎么办
布隆过滤器(Bloom Filter)是由一个很长的bit数组和一系列哈希函数组成的。本质上是一种数据结构,比较巧妙的概率型数据结构。它的特点是高效地插入和查询,并且根据查询结果可以知道某样东西一定不存在或者可能存在。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的,同时布隆过滤器还有一个缺陷就是数据只能插入不能删除。
全栈程序员站长
2022/11/08
7270
布隆过滤器原理简介视频_布隆过滤器误判怎么办
go 布隆过滤器_布隆过滤器 redis
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
全栈程序员站长
2022/11/08
6320
go 布隆过滤器_布隆过滤器 redis
品味布隆过滤器 Bloom filter的设计之美
你可能没想到: RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。
勇哥java实战
2023/04/14
2.3K0
品味布隆过滤器 Bloom filter的设计之美
大白话布隆过滤器
近期在做推荐系统中已读内容去重的相关内容,刚好用到了布隆过滤器,于是写了一篇文章记录分享一下。
Bug开发工程师
2020/04/24
1.6K0
大白话布隆过滤器
初识布隆过滤器
假如你的服务后台存储有大量数据,通过缓存提高查询效率,当缓存中不存某条记录再去数据库中查询,这就可以大大减少对数据库的请求压力。但是有一天某黑客构建大量不存在于缓存中的 key 发起缓存穿透攻击,在QPS足够高的情况下,有可能会把数据库压跨,这种情况下该怎么办呢?
恋喵大鲤鱼
2021/03/02
4810
初识布隆过滤器
BloomFilter布隆过滤器
位数组与Hash函数的联合使用。是一个包含m位的位数组,每位初始化为0,有k个不同的Hash函数,可将集合元素映射到位数组的某一位。插入元素需根据k个hash函数得到k个位,置为1。查询时判断这k个位(有0则该元素肯定不在集合中,都为1则该元素有可能在集合中)
名字是乱打的
2022/05/13
2520
BloomFilter布隆过滤器
布隆过滤器:原理与应用
这个时候,布隆过滤器(Bloom Filter)就派上了用场。 作为一种空间高效的概率型数据结构,布隆过滤器能够快速有效地检测一个元素是否属于一个集合。其应用广泛,从网络爬虫的网页去重,到数据库查询优化,乃至比特币网络的交易匹配,都离不开它的身影。
BookSea
2023/10/12
4720
Redis布隆过滤器原理与实践
在高并发请求时,业务数据一般会对数据进行缓存,提高系统并发量,因为磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。 做个简单计算,如果我们需要某个数据,该数据从数据库磁盘读出来需要0.1s,从交换机传过来需要0.05s,那么每个请求完成最少0.15s(当然,事实上磁盘和网络IO也没有这么慢,这里只是举例),该数据库服务器每秒只能响应67个请求;而如果该数据存在于本机内存里,读出来只需要10us,那么每秒钟能够响应100,000个请求。 通过将高频使用的数据存在离cpu更近的位置,以减少数据传输时间,从而提高处理效率,这就是缓存的意义。
全栈程序员站长
2022/11/08
4630
Redis布隆过滤器原理与实践
位图与布隆过滤器
此篇文章针对大量数据进行筛选或者判断重复,存在等一系列侧重于在特定空间,时间等允许范围内进行选择的问题提出解决方案。
羑悻的小杀马特.
2025/01/23
860
位图与布隆过滤器
海量数据处理利器之布隆过滤器
      看见了海量数据去重,找到停留时间最长的IP等问题,有博友提到了Bloom Filter,我就查了查,不过首先想到的是大叔,下面就先看看大叔的风采。 一、布隆过滤器概念引入       (B
mukekeheart
2018/02/27
1.4K0
海量数据处理利器之布隆过滤器
布隆过滤器,一文总结快速掌握,你能够get多少?
假如有一个15亿用户的系统,每天有几亿用户访问系统,要如何快速判断是否为系统中的用户呢?
Java程序猿阿谷
2021/03/11
1.4K0
布隆过滤器,一文总结快速掌握,你能够get多少?
Guava的布隆过滤器
 程序世界的算法都要在时间,资源占用甚至正确率等多种因素间进行平衡。同样的问题,所属的量级或场景不同,所用算法也会不同,其中也会涉及很多的trade-off。
程序员历小冰
2019/04/28
1.2K0
Guava的布隆过滤器
经典论文解读——布隆过滤器
作者:pishi,腾讯 PCG 后台开发工程师 布隆过滤器是一种具有空间优势的概率数据结构,用于回答一个元素是否存在于一个集合中这样的问题,但是可能会出现误判——即一个元素不在集合但被认为在集合中。 相信大家对布隆过滤器(Bloom Filter,BF)都不陌生,就算没用过也听过。布隆过滤器是一种具有空间优势的概率数据结构,用于回答一个元素是否存在于一个集合中这样的问题,但是可能会出现误判——即一个元素不在集合但被认为在集合中。 布隆过滤器可用于避免缓存穿透、海量数据快速查询过滤之类的场景。但是,大家真的了
腾讯技术工程官方号
2023/04/01
1.1K0
经典论文解读——布隆过滤器
【实战问题】-- 缓存穿透之布隆过滤器(1)
前面我们提到,在防止缓存穿透的情况(缓存穿透是指,缓存和数据库都没有的数据,被大量请求,比如订单号不可能为-1,但是用户请求了大量订单号为-1的数据,由于数据不存在,缓存就也不会存在该数据,所有的请求都会直接穿透到数据库。),我们可以考虑使用布隆过滤器,来过滤掉绝对不存于集合中的元素。
秦怀杂货店
2021/03/27
5920
布隆过滤器的原理_板框过滤器
之所以谈到布隆过滤器主要是因为以前工作中用到redis,为了防止缓冲穿透而使用了布隆过滤器(BloomFilter)。这次温故而知新,再深入学习它的原理,顺带提提它的其他用途。
全栈程序员站长
2022/11/08
3370
布隆过滤器的原理_板框过滤器
一文讲透“布隆过滤器”
布隆过滤器本质上就是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
架构精进之路
2020/08/28
2.5K0
一文讲透“布隆过滤器”
布隆过滤器
布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,false positive rate(误报率)越大,但是false negative (漏报)是不可能的。
大学里的混子
2019/02/20
8430
相关推荐
布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档