内容简介:当系统设计中出现多级缓存结构时,为了防止大量不存在的key值击穿高速缓存(比如主存),去直接访问低速缓存(如本地磁盘),我们一般需要将这部分key值,直接拦截在高速缓存阶段。这里,当然可以使用普通的hash table,也可以使用bitmap,但是这两种方式都比较耗费内存,当面对海量key值时,问题会变得更加严重。这时,就该介绍我们的主角bloom filter出场了。一般的,bloom filter用于判断一个key值是否在一个set中,拥有比hash table/bitmap更好的空间经济性。如果blo
当系统设计中出现多级缓存结构时,为了防止大量不存在的key值击穿高速缓存(比如主存),去直接访问低速缓存(如本地磁盘),我们一般需要将这部分key值,直接拦截在高速缓存阶段。这里,当然可以使用普通的hash table,也可以使用bitmap,但是这两种方式都比较耗费内存,当面对海量key值时,问题会变得更加严重。这时,就该介绍我们的主角bloom filter出场了。
一般的,bloom filter用于判断一个key值是否在一个set中,拥有比hash table/bitmap更好的空间经济性。如果bloom filter指示一个key值“不在”一个set中,那么这个判断是100%准确的。这样的特性,非常适合于上述的缓存场景。
原理
- 首先估计要判断的set中的元素个数N,然后选定k个独立的哈希函数。根据N和k,选定一个长度为M的bit array。
- 遍历set中的N个元素
- 对每个元素,使用k个哈希函数,得到k个哈希值(一般为一个大整数)
- 将上述bit array中,k个哈希值所对应的bit置1
- 对于需要判断的key值
- 使用k个哈希函数,得到k个哈希值
- 如果k个哈希值所对应的bit array中的值均为1,则判断此值在set中 “可能” 存在;
- 否则,判定 “一定” 不存在
优缺点
- 优点:
- 插入、查找都是常数时间
- 多个hash函数之间互相独立,可以并行计算
- 不需要存储元素本身,从而带来空间效率优势,以及一些保密上的优势
- bloom filter的bitmap可以进行交、并、差运算
- 缺点:
- 不准确:不在集合中的元素也有可能被判定在集合中
- 无法删除:
- 容易想到,可以将bitmap(0-1)变成可以计数的bitmap(0-1-2—-n),然后删除key时进行减法。
- 但是,这样还是有问题:万一删除的元素本来就不在集合中呢?然鹅,又无法准确的判断一个元素是否在集合中(有概率误判)
扩展
- 谷歌的BigTable中,就使用到了bloom filter对查询加速
- 预先缓存bloom filter在内存中,用于确定行或列是否“不存在”于磁盘上,从而避免了不必要的磁盘IO。而“不存在”是完全准确的
- 可以看到,Bloom Filter是一个利用概率学来对原始算法进行优化的例子。如果大家还有印象的话,我之前也介绍过一个使用类似思想的算法: Cardinality Estimation
转载请注明出处: http://blog.guoyb.com/2019/06/30/bloomfilter/
欢迎使用微信扫描下方二维码,关注我的微信公众号TechTalking,技术·生活·思考:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 你了解HTTPS,但你可能不了解X.509
- 你真的了解Mybatis的${}和#{}吗?是否了解应用场景?
- 你所了解的 array_diff_uassoc 真的是你了解的那样吗?
- 图文了解 Kubernetes
- 深入了解 JSONP
- 一文了解 Kubernetes
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++ 程序设计语言(特别版)(英文影印版)
[美] Bjarne Stroustrup / 高等教育出版社 / 2001-8-1 / 55.00
《C++程序设计语言》(特别版)(影印版)作者是C++的发明人,对C++语言有着全面、深入的理解,因此他强调应将语言作为设计与编程的工具,而不仅仅是语言本身,强调只有对语言功能有了深入了解之后才能真正掌握它。《C++程序设计语言》编写的目的就是帮助读者了解C++是如何支持编程技术的,使读者能从中获得新的理解,从而成为一名优秀的编程人员和设计人员。一起来看看 《C++ 程序设计语言(特别版)(英文影印版)》 这本书的介绍吧!