文章目录

  • 1. 什么是布隆过滤器
  • 2. 实现原理
    • 2.1 HashMap 的问题
    • 2.2 布隆过滤器数据结构
    • 2.3 BloomFilter 的缺点
    • 2.4 如何选择哈希函数个数和布隆过滤器长度
  • 3. 最佳实践
    • 3.1 大Value拆分
  • 参考

1. 什么是布隆过滤器

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

2. 实现原理

2.1 HashMap 的问题

讲述布隆过滤器的原理之前,我们先思考一下,通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。

原文的 O(1) 查找复杂度是不完全对的,因为hashmap首先hash计算到桶,出现碰撞后会采用链或红黑树,此时需要遍历链表或树,复杂度会增加。

但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。

还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。

2.2 布隆过滤器数据结构

布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:

如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1,例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7,则上图转变为:

注意:多个哈希函数会生成多个哈希值,对应多个位置。


Ok,我们现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为:

值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。

现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。

而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

2.3 BloomFilter 的缺点

布隆过滤器之所以能做到在时间和空间上的效率比较高,是因为牺牲了判断的准确率、删除的便利性。

  • 存在误判,可能要查到的元素并没有在容器中,但是 Hash 之后得到的 K 个位置上值都是1。如果 bloomfilter 中存储的是黑名单,那么可以通过建立一个白名单来存储可能会误判的元素。

  • 删除困难。一个放入容器的元素映射到 bit 数组的k个位置上是1,删除的时候不能简单的直接置为0,可能会影响其他元素的判断。可以采用Counting Bloom Filter。

2.4 如何选择哈希函数个数和布隆过滤器长度

很显然,过小的布隆过滤器很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”,起不到过滤的目的了。布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小。

另外,哈希函数的个数也需要权衡,个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,那我们的误报率会变高。

3. 最佳实践

常见的适用常见有,利用布隆过滤器减少磁盘 IO 或者网络请求,因为一旦一个值必定不存在的话,我们可以不用进行后续昂贵的查询请求。

另外,既然你使用布隆过滤器来加速查找和判断是否存在,那么性能很低的哈希函数不是个好选择,推荐 MurmurHash

可以使用布隆过滤器来解决redis的缓存穿透问题。

3.1 大Value拆分

Redis 因其支持 setbit 和 getbit 操作,且纯内存性能高等特点,因此天然就可以作为布隆过滤器来使用。但是布隆过滤器的不当使用极易产生大 Value,增加 Redis 阻塞风险,因此生成环境中建议对体积庞大的布隆过滤器进行拆分。

拆分的形式方法多种多样,但是本质是不要将 Hash(Key) 之后的请求分散在多个节点的多个小 bitmap 上,而是应该拆分成多个小 bitmap 之后,对一个 Key 的所有哈希函数都落在这一个小 bitmap 上。

参考

《详解布隆过滤器的原理,使用场景和注意事项》
《BloomFilter解决缓存穿透问题》

【redis】详解布隆过滤器BloomFilter的原理,使用场景和注意事项相关推荐

  1. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  2. Redis的分布式布隆过滤器是什么原理?

    [原创] 老顾聊技术 2020-08-07 23:01:58 欢迎关注头条号:老顾聊技术 精品原创技术分享,知识的组装工 问题 老顾先来举个常会问到的面试题:现有50亿个电话号码,现有10万个电话号码 ...

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

    在进入正文之前,之前看到的有句话我觉得说得很好: Data structures are nothing different. They are like the bookshelves of you ...

  4. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项

    今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 "布隆过滤器原理都不懂,还要我优化?".技术菜被人怼认了.怪不 ...

  5. 详解布隆过滤器的原理和实现

    为什么需要布隆过滤器 想象一下遇到下面的场景你会如何处理: 手机号是否重复注册 用户是否参与过某秒杀活动 伪造请求大量 id 查询不存在的记录,此时缓存未命中,如何避免缓存穿透 针对以上问题常规做法是 ...

  6. Redis bitmap、hyperlog、布隆过滤器、RoaringBitmap原理应用场景与日活的统计的具体应用

    传统方案-mysql 缺点: 1.空间占用大 2.统计逻辑复杂,比如 统计最近 30 天用户的累计活跃天(每个用户在 30 天里有 N 天使用 app,N 为 1-30,然后将月活跃用户的 N 天加总 ...

  7. 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter

    文章目录 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter 1.布隆过滤器的起源,用途 2.布隆过滤器的概念 3.布隆过滤器的优缺点 1.优点 2.缺点 4.应用 ...

  8. 布隆过滤器(BloomFilter)原理 实现和性能测试

    目录 BloomFilter的原理 如何确定最优的m和k? guava中的BloomFilter 使用案例 和HashSet对比 测试环境 测试方式 BloomFilter vs HashSet 在不 ...

  9. 一文搞懂布隆过滤器(BloomFilter)

    1 什么是布隆过滤器 布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器本 ...

最新文章

  1. R语言双因素方差分析
  2. 以太坊节点布置(4) geth节点互联
  3. oracle集群图例
  4. windows符号服务器地址
  5. 算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”
  6. P5706 【深基2.例8】再分肥宅水(python3实现)
  7. 图解算法系列笔记(一)
  8. 媒体转码切片_cVideo云转码系统
  9. C# 数组增加元素_C语言数组——任意位置插入一个元素
  10. 软件开发工程师应该具备哪些证书_智能展厅设计应该具备哪些特点?
  11. 马斯克说,特斯拉卡车有Mad Max狂野模式,危险的变道操作?
  12. PyQt5:入门使用教程
  13. 关于联想Y400/Y500刷BIOS解锁网卡、单双650M、单双750M超频
  14. 同济大学高数第七版下册对梯度的解释
  15. OPPO R9KM手机刷机救砖线刷包附驱动教程
  16. 【英语语法入门】 第21讲 将来时
  17. w10恢复出厂设置_win10系统恢复出厂设置失败如何解决
  18. Linux文件裸写,Linux下使用裸設備作為數據文件
  19. 北斗终端与计算机传输信息,基于北斗信息的手机终端的应用研究
  20. Pygame实战之外星人入侵NO.7——大批外星人来袭

热门文章

  1. 各大平台会员卡卷接口源码分享
  2. 合金轮毂售后市场现状研究分析与预测报告
  3. MATLAB学习之多项式拟合和多项式插值(附源代码)
  4. encodeURI之URL中文参数问题
  5. 那一刻 ...... ......
  6. k8s安装elasticSearch(简易版)
  7. udp socket: 简单的数据包与视频流传输
  8. Unity Package Manager Resolving packageds...
  9. Kolla-ansible下ceilometer gnocchi grafana监控配置
  10. 阿迪达斯健身跟踪器:具备音乐播放列表和跑步路线推荐功能