Bloom Filter(布隆过滤器)以牺牲少量正确率为代价,利用较少的空间实现O(1)的查询,在LSM Tree、Cache中作为常见的读优化手段。...本文结合谷歌的Guava源码介绍Bloom Filter的实现。...filter), given the * expected insertions and total number of bits in the Bloom filter...* * See http://en.wikipedia.org/wiki/File:Bloom_filter_fp_probability.svg for the formula..../** * Computes m (total bits of Bloom filter) which is expected to achieve, for the specified *
,如 Join 时用 Build 侧数据生成谓词过滤 Probe 侧; 二级索引辅助:用 Bloom Filter、Cuckoo Filter等轻量级索引快速判断数据是否存在,避免全文件扫描。...v2, ..., vn)谓词,Probe 侧用该谓词过滤,仅保留 Join 列在In列表中的行,过滤率 100%(无误判); 当 Build 侧数据量 > 阈值:生成 Bloom Filter(布隆过滤器...),Probe 侧用 Bloom Filter 判断 Join 列是否 “可能存在” 于 Build 侧: 若 Bloom Filter 判断 “不存在”,直接跳过该行; 若判断 “可能存在”,继续后续...为什么用 Bloom Filter:当 Build 侧数据量极大(如 100 万行),生成 In 谓词的开销(存储、传输、解析)过高,而 Bloom Filter 体积小(如 100 万行仅需几 MB)...例:Build 侧构建 Bloom Filter 需 2 秒,Probe 侧前 1 秒读取的数据未过滤,但 1 秒后启用 Bloom Filter,过滤后续 80% 的数据,整体仍能大幅减少 Join
但当订单量突破亿级时,传统方案(查数据库、查 Redis Set)会因 “内存占用大”“查询慢” 失效,而布隆过滤器(Bloom Filter)凭借 “低内存、高吞吐、O (1) 查询” 的特性,成为这类场景的最优解...结论:用 “360MB 位数组 + 10 个哈希函数”,可存储 2 亿个订单号,误判率控制在 0.1% 以下 —— 完全满足订单场景需求,且内存成本极低。3....,error_rate=0.001(误判率),capacity=200000000(预计2亿订单)BF.RESERVE order_bloom_filter 0.001 200000000EXPANSION...= "order:bloom:filter"; // 误判率(与Redis初始化时一致) private static final double ERROR_RATE = 0.001;...,查询 “当天 + 近 30 天” 的所有过滤器,只要有一个过滤器判断 “可能存在”,就进行数据库校验;过期过滤器清理:每天凌晨删除 “30 天前” 的过滤器(如DEL order:bloom:filter
Bloom Filter就是一种解决方案。 Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。...Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。 ?...如果bloom filter中存储的是黑名单,那么可以通过建立一个白名单来存储可能会误判的元素。 删除困难。...可以采用Counting Bloom Filter Bloom Filter 实现 布隆过滤器有许多实现与优化,Guava中就提供了一种Bloom Filter的实现。...如果用哈希表,每存储一亿个 email地址,就需要 1.6GB的内存(用哈希表实现的具体办法是将每一个 email地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有
我们计算一下用这种方式耗费的存储空间。每个十六进制数占用4 b,1个指纹用40个十六进制数表示,占用空间为20 B,1万个指纹即占用空间200 KB,1亿个指纹占用2 GB。...了解Bloom Filter Bloom Filter,中文名称叫作布隆过滤器,是1970年由Bloom提出的,它可以被用来检测一个元素是否在一个集合中。...Bloom Filter的空间利用效率很高,使用它可以大大节省存储空间。Bloom Filter使用位数组表示一个待检测集合,并可以快速地通过概率算法判断一个元素是否存在于这个集合中。...本节我们来了解Bloom Filter的基本算法,以及Scrapy-Redis中对接Bloom Filter的方法。 2....Bloom Filter的实现就已经完成了,我们可以用一个实例来测试一下,代码如下: conn = StrictRedis(host='localhost', port=6379, password='
这是第二篇,Bloom Filter。...作者:青藤木鸟 https://www.qtmuniao.com/2020/11/18/leveldb-data-structures-bloom-filter, 转载请注明出处 原理 Bloom Filter...但是 Bloom Filter 走了另一条路,并不存储数据项本身,而是存储数据项的几个哈希值,并且用高效紧凑的位数组来存,避免了指针的额外开销。...如此设计,使得 Bloom Filter 的大小与数据项本身大小(如字符串的长短)无关。...SSTable 文件中一起存储,并且在需要时加载到内存,这要求 Filter 占空间不能太大。
所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。 此外,Bloom Filter的hash函数选择会影响算法的效果。...将元素全部添加入Bloom Filter后,我们能得到真实的空间使用率,用这个值代入公式计算出一个比m小的值,重新构造Bloom Filter,对原先的哈希值进行求余处理,在误判率不变的情况下,使得其内存大小更合适...一般key-value存储系统的values存在硬盘,查询就是件费时的事。将Storage的数据都插入Filter,在Filter中查询都不存在时,那就不需要去Storage查询了。...Proxy-Cache 在Internet Cache Protocol中的Proxy-Cache很多都是使用Bloom Filter存储URLs,除了高效的查询外,还能很方便得传输交换Cache...如果用哈希表,每存储一亿个 email地址,就需要 1.6GB的内存(用哈希表实现的具体办法是将每一个 email地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有
Url排重Bloom Filter 算法、误差及其他 fly with me , in the perfect world --- 题记 最近看了一些书,公式和算法,用一个词把他们窜起来的话...在Url排重方面还有一个常用的算法:Bloom Filter 算法。...Bloom Filter 的优点是什么呢? 1、Bloom Filter不存储key-value值,Bloom Filter 用一组Hash算法把集合S中的元素E换算成位表示; 2、查询速度快。...我们知道Hash算法一般都有冲突,在Bloom Filter中的冲突就表现为误差了。...Bloom Filter 是有误差的,但误差在可控制的程度内。换句话说,大多数的误差的恼人之处在于我们无法衡量它。
filter的存储,有两个任意的hash函数(比如md5/sha256) 初始情况下,8位为0。...) % 8 = 3,将存储的第3位置为1: 如果要判定hello是否在bloom filter的存储中,则只需要检查第3/7位是否是1,因为hello的两次hash的结果是已知的: assert bloomData...bloom filter的优势在于: 使用很少的存储表示一个集合(在本例中是一个uint64) 判定(与bit位相比)较多的数据“一定不存在于”或“可能存在于”这个集合中。...用其它的hash算法也可。...// SetBloomUInt64 用一个uint64做bloom过滤器的存储,给msg做摘要提取并设置到origin中,返回值为被设置后的值 func SetBloomUInt64(origin
在所要表达的集合是静态集合的时候,标准 Bloom Filter 可以很好地工作,但是如果要表达的集合经常变动,标准Bloom Filter的弊端就显现出来了,因为它不支持删除操作。...二、什么是 Counting Bloom Filter Counting Bloom Filter 的出现,解决了上述问题,它将标准 Bloom Filter 位数组的每一位扩展为一个小的计数器(Counter...Counting Bloom Filter 通过多占用几倍的存储空间的代价, 给 Bloom Filter 增加了删除操作。基本原理是不是很简单?...看下图就能明白它和 Bloom Filter 的区别在哪。 ?...Bloom Filter)利用 d-left hashing 的方法存储 fingerprint,解决哈希表的负载平衡问题;ACBF(Accurate Counting Bloom Filter)通过
因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。...检测广播消息包的环路,将Bloom Filter保存在包里,每个节点将自己添加入Bloom Filter。 信息队列管理,使用Counter Bloom Filter管理信息流量。...如果用哈希表,每存储一亿个 email 地址,就需要1.6GB 的内存(用哈希表实现的具体办法是将每一个email 地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有...而Bloom Filter只需要哈希表1/8 到1/4 的大小就能解决同样的问题。Bloom Filter决不会漏掉任何一个在黑名单中的可疑地址。...注意:hbase的bloom filter是惰性加载的,在写压力比较大的情况下,会有不停的compact并产生storefile,那么新的storefile是不会马上将bloom filter加载到内存的
三、不同方案的实验报告于是我开始系统地比较各种方案:方案原理优点缺点Bloom Filter用多个哈希函数映射到位数组占内存小、速度快有误判(少量URL被错判为已存在)Redis HyperLogLog...四、最终方案:Bloom Filter + Redis + 持久化备份最后定下的架构是这样的:Bloom Filter 负责实时查重,超快;Redis HyperLogLog 负责全局唯一统计(看总共抓了多少个不同...URL);文件持久化 定时保存Bloom Filter状态,防止重启丢失。...bloom.bit_array.tofile(f) print("Bloom Filter 持久化完成。")...七、总结:没有完美方案,只有合理组合层级工具作用内存层Bloom Filter高速查重分布式层Redis HyperLogLog唯一数统计存储层文件 / SQLite宕机恢复做采集久了你会发现: “去重
一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。...如果用哈希表,每存储一亿个 email 地址, 就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹googlechinablog.com/2006/...因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。...下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0,如图9-5所示。 ?...为了add一个元素,用k个hash function将它hash得到bloom filter中k个bit位,将这k个bit位置1。
Bloom Filter就是一种解决方案。 Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。...Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元 素不再集合,那肯定不在。如果判断元素存在集合中,有一定的概率判断错误。...Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概 率。 ?...如果bloom filter中存储的是黑名单, 那么可以通过建立一个白名单来存储可能会误判的元素。 删除困难。...可以采用Counting Bloom Filter Bloom Filter 实现 布隆过滤器有许多实现与优化,Guava中就提供了一种Bloom Filter的实现。
为了判断是否存在得把所有的数据都存储起来,这个数据量得有多大。 所以我们先把map这种数据结构先排除掉,去看看本期的主角:Bloom Filter。...这里数组的大小用m表示,hash functions的个数用k来表示。n则表示数据量的大小。 ? ?...guava里的Bloom Filter使用的就是Murmur哈希算法。 ? MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。...总之,Bloom Filter就三点:数组、hash生成规则、hash算法(Murmour)。...总结 Bloom Filter核心就是数组和hash。数组中1表示存在,0表示不存在。Bloom Filter有一定的误报率。
由此可见,Bloom filter也不是完美的,它的高效也是有一定代价的,它通过容忍一定的错误率发生换取了存储空间的极大节省。...三、优缺点 与其它数据结构相比较,Bloom filter的最大优点是空间效率和查找时间复杂性,它的存储空间和插入/查询时间都是常数。Hash函数之间没有相关性,可以方便地由硬件并行实现。...Bloom filter不需要存储元素本身,在某些对保密要求非常严格的场合有优势。另外,Bloom filter一般都可以表示大数据集的全集,而其它任何数据结构都难以做到。...这使得要求“零错误”的场合无法应用Bloom filter。其次,一般情况下不能从Bloom filter中删除元素。...这两方面也是目前Bloom filter的重点研究方向,有不少工作,使得出现了很多Bloom filter的变种。
因此为了解决穿库的问题,我们引入Bloom Filter。...原因是除了Bloom Filter 本身有误判率,宕机之前的缓存不一定能覆盖到所有DB中的数据,当宕机后用户请求了一个以前从未请求的数据,这个时候就会产生误判。...from=pc] 这个结构就像洗澡的时候用的双向阀门:左边热水,右边冷水。 大部分的编程语言都内置了filter。...其实早在1970年由Burton Howard Bloom提出的布隆过滤器(英语:Bloom Filter)。它实际上是一个很长的二进制向量和一系列随机映射函数。...从github topics: bloom-filter中经过简单的调研。
因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。...(3)现在,把这个n个元素依次用第1步选取的k个哈希函数映射到bit数组的位置上,bit数组被映射到的位置的元素变为1。显然,一个元素能被映射到k个位置上。...具体做法就是:将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url...5、如何解决布隆过滤器不支持删除的问题: (1)counting bloom filter: Counting Bloom Filter将标准 Bloom Filter位数组的每一位扩展为一个小的计数器...Counting Bloom Filter通过多占用几倍的存储空间的代价,给Bloom Filter增加了删除操作。
整体物料存储用Concurrent HashMap结构,更新速度可达数万/s,满足物料数量要求。...推特推荐系统原已读是基于 bloom filter 实现。...如图为推特原 30 天已读方案实例:共四个 filter,每十天存储一个 filter,每次读取覆盖最近 30 天的四个 filter,取回 bloom filter 后通过或运算将其合并成一个 bloom...该方案: 结构不合理,面对所有用户 bloom filter 大小均不变,因此:高消费的用户使用推特频率高,填充率高,则误判高;低消费用户阅读量小,空间利用率低,浪费资源 直接读取存储的 Redis,存储一旦出错服务也难免受牵连...bloom filter 完成已读记录 稳定性,一方面建立独立的短期(如几个小时)已读存储,在主要资源不可用时提供降级服务;另一方面,优化 Redis 资源访问方式,Meta 信息及最新一个 bloom