前言

在计算机的世界中,数据计算和处理都是准确无误的,这在大多数人看来是理所当然的,确实也应该是这样的。但是在某些场景下完全的准确无误意味着很高的代价,不管是时间上还是空间上。

于是大家都在考虑,能不能有一些方法能在很小的错误率的前提下,能大幅度提高效率减少资源消耗,而对于小概率误判的场景,能通过容错机制将窟窿补上。显然有,在这种背景下,咱们本文的主角,一个“不靠谱”的二愣子Bloom Filter(布隆过滤器)登场了。

和偶像剧剧情不同,二愣子没有因为自身的“缺点”而两集就“领盒饭”了,反而通过自己的机智和勇敢,直接C位出道,获取众多美女的芳心,这妥妥的韦爵爷在世啊,下面我们就来说说大数据处理中的韦小宝是如何超神的。

今天的图片就不介绍了,想必大家也很了解了,鹿鼎记是金庸老先生的封笔之作,韦小宝也是金庸老先生最喜欢的角色。而我认为陈小春版的韦小宝是原著还原度最高的存在。他优缺点都很明显,不按套路出牌,经常另辟蹊径,有很多创造性思维,扬长避短,无限发挥自己的优势,正如今天我们文章的主角——布隆过滤器。

正文

What布隆过滤器?

先来说说今天主角的诞生记:

Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。基于一种概率数据结构来实现,是一个有趣且强大的算法

How布隆过滤器?

以人名来命名的算法一般都很牛,这个也不例外。他利用了位图的部分实现(如果不了解位图,可以参考下上一篇文章面试以及大数据处理中的常客BitMap到底是个什么样子的存在?),扬长避短,既发扬了位图的优势,又规避了位图的劣势,站在巨人的肩膀上,成就了自身的荣耀。下面先来看看位图的缺点:

  • 数据密集时效率比较高:当数据分布均匀时,位图的效率很高,占用的空间也很理想;但是如果数据稀疏,比如大部分数据都分三段,1-1000,100000-500000,100000000-200000000,这时候的位图必须按照最大值进行初始化申请空间,这就造成了很多空间的浪费。

  • 最大数据量要求已知:因为位图需要根据数据量来初始化位图存储数组,所以要求在设计之初知晓数据量,然后根据最大数据量进行数据初始化,如果后续数据量超出了预先的最大值,则位图很难处理。

  • 适用范围有限:位图比较适合处理数值类型的数据,针对于字符串类的数据虽然可以使用hash函数将字符串映射到某一位,但缺点是单一哈希函数发生冲突的概率太高,造成错误率过高。若要降低冲突发生的概率到1%,有种办法就是就要将位图的长度设置为字符串个数的100倍。

所谓时势造英雄,韦小宝是这样,布隆过滤器也是如此。针对上述问题,布隆过滤器给出了自己的解决方案:首先,布隆过滤器打算在位图的基础上去解决刚才的三个问题,从而“基本”达到目的,此处的基本很重要,先卖个关子,大家记住即可,下面进行解释。

减少哈希冲突概率

上文说了单一hash函数的冲突概率太高,那么单一函数太高,那多个函数会不会好些呢?

答案是肯定的,于是布隆过滤器使用多个哈希函数来对字符串进行映射,生成多个位放到位图中存储。如下图所示:

查询时,用同样的哈希函数对字符串进行处理,生成多个位,有一位如果是0,则说明该字符串肯定不存在;而如果所有位都是1,那说明该字符串大概率存在。下图展示的就是字符串肯定不存在,因为有一个哈希函数返回0:

大概率存在于位图中?Excuse me?这种答案抛给用户,让用户如何是好?信你还是不信?Don't worry!车到山前必有路,这里有两个问题需要确认:

  • 首先就是正确率的问题,如果正确率过低,那这个算法就没什么存在的意义了,但是如果正确率很高,仅有很少的错误率,那在容错成本很低的前提下总会有办法进行容错。那如何提高正确率呢?其实有两个因素,一个就是位图的位数与数据量的比值,其实就是数据冗余量;第二个就是哈希函数的个数。关系如下图所示:

图中的字母代表意思如下:

  • m :BitSet 位数

  • n :插入字符串个数

  • k :hash函数个数

从上图可以看出,数据冗余量越大,哈希函数越多,错误率越低。但是总体来看,错误率控制在1%以内,相比于位图需要100倍的数据膨胀率,布隆过滤器的成本消耗就小得多,所以现实中使用场景就多了很多。

考虑到实现成本,每种组件或者场景在实现的时候会根据自身的具体情况选择具体的比例,从而达到最佳性价比,毕竟大数据处理说到底还是一门生意,成本是技术选型的重要因素之一。这也同样解释了上文的“基本”的含义。

  • 确定了正确率的问题后,接下来就是关键的容错了,怎么容错才算完美,既能解决问题,又能照顾容错成本呢?这个就和具体的使用场景有关了,下面会结合业务场景来具体说明。

降低数据稀疏带来的影响

说完了减少哈希冲突概率后,问题就解决了一大半,剩下的问题就顺手解决了。由于布隆过滤器使用多个哈希函数进行处理,所以生成的值正常会均匀分布,数据不均衡从而造成数据稀疏时成本较高的问题就彻底解决了。

对数据量已知的要求降低

虽然说数据量增大超过预先设计的最大值也会对布隆过滤器造成影响,但是影响并不是很严重,除非差别过于巨大。因为实际数据量增大后,只会影响到上图m/n的值,带来的影响只是略微影响到布隆过滤器的正确率,而不像位图那样几乎无法处理。

就这样,一个大数据世界中的韦小宝已经呼之欲出了,剩下就是找到属于他发挥的舞台,然后找到7个美女老婆了。

Where布隆过滤器

说完布隆过滤器的特点以及实现原理,下面看看布隆过滤器的使用场景。

通过不同场景中使用,我们可以看到布隆过滤器是如何发挥重要作用,以及如何扬长避短进行容错的。也就同时知道了布隆过滤器是如何赢得“美女”芳心,从而抱得美人归的。

URL或者Email去重

这其实是布隆过滤器初次亮相的场景,布隆过滤器在这个场景中崭露头角,迅速被大家所认知。

场景

假设我们要写一个爬虫程序。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”,爬虫就会进入一个无限怪圈,找不到出路,程序出现崩溃。所以为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL,也就是如何判重。

同样的,如果我们需要给很多人发邮件从而通知或者确认某些事情,为了不重复给同一个人发多次而引发大规模的不满,我们要如何知道已经发过邮件的那些Email,同样也是如何判重。

实现

这时布隆过滤器就登场了,将爬取过的URL以及发过邮件的Email放入到布隆过滤器中,下次发现新的URL或者Email就去布隆过滤器中问问,就知道是不是处理过了。

防止缓存穿透

上面的场景的小试牛刀后,布隆过滤器决定乘胜追击,再接再厉,扩大自己的知名度。

场景

在数据库访问中,一般都会有缓存层来减少数据库的直接访问。一来提升查询效率;二来也可以保护数据库不会在高并发的场景下被搞崩溃。

所以正常的查询流程是client先访问缓存层,如果命中直接返回;如果未命中,则认为可能是缓存与数据库不一致或者不是热数据,会去查询数据库。

这本来是很正常的业务逻辑,在缓存命中率很高的情况下效果很好效率很高,但是有一种恶意攻击行为,使用一个完全不可能存在的key频繁访问查询接口,由于key不存在,则缓存完全无法起到作用,直接频繁访问数据库,直到数据库被搞瘫痪或者始终处于高负载的情况影响正常的业务逻辑的开展。

实现

这时布隆过滤器又登场了,将数据库中对应缓存的所有key放入到布隆过滤器中,下次穿透缓存层的数据就去布隆过滤器中问问数据库中到底有没有这个值,有的话再去数据库查,没有的话就直接返回结果,避免无效的数据库查询。从而达到保护数据库,英雄救美的效果。

NOSQL数据库的索引过滤器

经过上述两次战役,已经使布隆过滤器名扬天下了,但是真正使布隆过滤器走上人生巅峰的是大数据时代的NOSQL数据库中的应用,在这个场景下,布隆过滤器真正的实现了超神之路,HBase、Cassandra、RocksDB以及LevelDB都是布隆过滤器的一众迷妹。

场景

在NOSQL数据库中,虽然经过无数次的shard以及index后,数据查询的效率得到了显著的提升,但是定位到最小粒度的索引文件后,还是需要遍历才能得知数据是否存在,如果存在,再去查询对应的数据。这对于NOSQL数据库来说是不可接受的,此时咱们的布隆过滤器再度登场。

实现

布隆过滤器存储目标索引对应的key,查询时先拿key查询布隆过滤器,如果存在后再去索引文件中遍历查询。这样能直接判断出索引中是否包含需要查询的数据,从而避免无用的遍历操作。达到提升效率的目的。

容错

最后根据上面的场景来统一说一下容错这个听起来很有技术含量又高大上的操作。我相信文章看到现在的小伙伴们可能已经猜到了布隆过滤器是怎么做容错的了。没错,布隆过滤器的容错操作就是不容错!!!

纳尼?不容错?有没有搞错?我没听错?是的,确实不容错,为什么不容错呢?因为容错的目的是消除错误带来的严重影响,但是大家回头看看如果布隆过滤器不容错会有什么影响?无非就是多爬取几个网页;多发几封邮件;多查几次数据库以及多遍历几次文件。

后果很严重吗?显然不是!!!由于布隆过滤器的正确率可控,所以相比于绝大多数正确的过滤,几次误判导致的消耗不值得一提,所以不容错就显得理所当然了,这个懒可以偷。诸如韦小宝时不时的偷奸耍滑,无伤大雅。

总结

上文总结了布隆过滤器的超神之路,相比于常规的处理方式,布隆过滤器算得上另辟蹊径,在尽量保证准确率的前提下,加速了大数据处理以及查询的速度,容错处理也“堪称经典”....在很多场景下发挥了奇效。

这正如韦小宝,在小说中的那种环境下如鱼得水,斩获了不世之功;获取了海量宝藏;实现了最终梦想。

这就是所谓的时势造英雄吧,技术如此,人也亦然。

最后,笔者长期关注大数据通用技术,通用原理以及NOSQL数据库的技术架构以及使用。如果大家感觉笔者写的还不错,麻烦大家多多点赞和分享转发,也许你的朋友也喜欢。

最后挂个公众号二维码,欢迎大家关注,谢谢大家支持。

“不靠谱“的布隆过滤器是怎么成为大数据世界中的韦小宝的?相关推荐

  1. 布隆过滤器速度_5 分钟搞懂布隆过滤器,过滤亿级数据

    在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题.如网页 URL 去重.垃圾邮件识别.大集合中重复元素的判断和缓存穿透等问题. 布隆过滤器(Bloom Fil ...

  2. Redis实现的布隆过滤器如何快速有效删除数据

    这不是一篇搭建教程,因为用Redis实现布隆过滤器很简单,Redis本身就支持bitmap这种数据结构,通过setbit和getbit即可实现一个Bloom Filter.本文要讨论的是测试过程中,或 ...

  3. redis的HyperLogLog与布隆过滤器

    HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法. HyperLogLog是在大数据量的情况下关于数据基数的空间复杂优化实现,而布隆过滤是在大数据量情况下关于检索一个元素是 ...

  4. Redis 之布隆过滤器,增强版,布谷鸟过滤器

    https://www.cnblogs.com/Chary/p/15682276.html 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤 ...

  5. 牛逼哄哄的布隆过滤器,到底有什么用?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 原文:www.cnblogs.com/CodeBear/p ...

  6. Redis亿级数据过滤和布隆过滤器

    来自:我没有三颗心脏 一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 ...

  7. Redis 高级主题之布隆过滤器(BloomFilter)

    最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...

  8. 《数学之美》第23章 布隆过滤器

    1 布隆过滤器的原理 一般来讲,计算机中的集合是用散列表(Hash Table)来存储的,优点是速度准确,缺点是耗费存储空间. 布隆过滤器是由伯顿布隆于1970年提出的.它实际上是一个很长的二进制向量 ...

  9. 布隆过滤器速度_布隆过滤器的分析和实现

    腾讯曾经出过这样一道面试题. 给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. 拿到这个题目,我们首先想到的是遍历这40亿的数字,然后一个一个找.显然 ...

  10. 【redis】布隆过滤器详解

    简介 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),它实际上是一个很长的二进制向量和一系列随机映射函数. 布隆过滤器可以用于检索 ...

最新文章

  1. Django博客系统工程创建和配置
  2. 弃用notepad++
  3. lastpass密码管理工具使用教程
  4. MFC——AfxParseURL用法
  5. 浏览器弹不出java_打开网址跳出弹窗“您的浏览器没有获得Java virtual machine 支持”,怎么办?...
  6. 【数字图像处理】Canny边缘检测详解及编程实现
  7. 数据结构-第十章 排序
  8. tcp总结与简单实现
  9. bootstrap之项目一的填坑
  10. python getopt的用法
  11. cocos2d 物理平抛,斜抛运动
  12. 从CAP 到编程语言的猜想
  13. 【逗老师带你学IT】阿里云监控报警回调+转发企业微信+转发SnmpTrap+PRTG
  14. Mybatis Plus 3.1.1 lambda 表达式查询时异常 cannot find the corresponding database column name!
  15. mac恢复出厂设置_如何恢复Mac的出厂设置
  16. SQL server 身份验证
  17. 删除vlan 华为s5720_华为S5720系列交换机快速配置手册常用命令
  18. linux版本的多屏协同,一招搞定手机和电脑的多屏协同
  19. 如何快速的登陆github
  20. Appium报错Original error: Could not proxy command to the remote server. Original error: socket hang up

热门文章

  1. 用来做重试的库Tenacity
  2. Paper intensive reading (二十五):Fecal Viral ...Virion-Enriched Metagenomics and Metatranscriptomics
  3. 软考高项 : (27)信息系统项目管理师模拟试题
  4. 华为HCNA笔记-TO-BE-CONTINUED
  5. win7如何设置通电自动开机_电脑如何设置自动开机,教您如何设置
  6. web页面-JS/DOM/BOM/窗口滚动/修改内容/上传文件
  7. 国仁猫哥:视频号企业运营指南教科书;不可错失的红利。
  8. 5G核心网技术基础自学系列 | (增强型)专用核心网
  9. 《拥抱变化——社交网络时代的企业转型之道》一第2章 找准组织目标和企业文化...
  10. Idea的全局搜索快捷键