Bloom Filter是一个占用空间很小、效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成。可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1)。

在很多场景下,我们都需要一个能迅速判断一个元素是否在一个集合中。譬如:

网页爬虫对URL的去重,避免爬取相同的URL地址;

反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信);

缓存击穿,将已存在的缓存放到布隆中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉。

可能有人会问,我们直接把这些数据都放到数据库或者redis之类的缓存中不就行了,查询时直接匹配不就OK了?

是的,当这个集合量比较小,你内存又够大时,是可以这样做,你可以直接弄个HashSet、HashMap就OK了。但是当这个量以数十亿计,内存装不下,数据库检索极慢时该怎么办。

以垃圾邮箱为例

方案比较

1.将所有垃圾邮箱地址存到数据库,匹配时遍历
2.用HashSet存储所有地址,匹配时接近O(1)的效率查出来
3.将地址用MD5算法或其他单向映射算法计算后存入HashSet,无论地址多大,保存的只有MD5后的固定位数
4.布隆过滤器,将所有地址经过多个Hash算法,映射到一个bit数组

优缺点

方案1和2都是保存完整的地址,占用空间大。一个地址16字节,10亿即可达到上百G的内存。HashSet效率逼近O(1),数据库就不谈效率了,不在一个数量级。
方案3保存部分信息,占用空间小于存储完整信息,存在冲突的可能(非垃圾邮箱可能MD5后和某垃圾邮箱一样,概率低)
方案4将所有地址经过Hash后映射到同一个bit数组,看清了,只有一个超大的bit数组,保存所有的映射,占用空间极小,冲突概率高。
大家知道,java中的HashMap有个扩容参数默认是0.75,也就是你想存75个数,至少需要一个100的数组,而且还会有不少的冲突。实际上,Hash的存储效率是0.5左右,存5个数需要10个的空间。算起来占用空间还是挺大的。
而布隆过滤器就不用为每个数都分配空间了,而是直接把所有的数通过算法映射到同一个数组,带来的问题就是冲突上升,只要概率在可以接受的范围,用时间换空间,在很多时候是好方案。布隆过滤器需要的空间仅为HashMap的1/8-1/4之间,而且它不会漏掉任何一个在黑名单的可疑对象,问题只是会误伤一些非黑名单对象。

原理

初始化状态是一个全为0的bit数组
为了表达存储N个元素的集合,使用K个独立的函数来进行哈希运算。x1,x2……xk为k个哈希算法。
如果集合元素有N1,N2……NN,N1经过x1运算后得到的结果映射的位置标1,经过x2运算后结果映射也标1,已经为1的报错1不变。经过k次散列后,对N1的散列完成。
依次对N2,NN等所有数据进行散列,最终得到一个部分为1,部分位为0的字节数组。当然了,这个字节数组会比较长,不然散列效果不好。
那么怎么判断一个外来的元素是否已经在集合里呢,譬如已经散列了10亿个垃圾邮箱,现在来了一个邮箱,怎么判断它是否在这10亿里面呢?
很简单,就拿这个新来的也依次经历x1,x2……xk个哈希算法即可。
在任何一个哈希算法譬如到x2时,得到的映射值有0,那就说明这个邮箱肯定不在这10亿内。
如果是一个黑名单对象,那么可以肯定的是所有映射都为1,肯定跑不了它。也就是说是坏人,一定会被抓。
那么误伤是为什么呢,就是指一些非黑名单对象的值经过k次哈希后,也全部为1,但它确实不是黑名单里的值,这种概率是存在的,但是是可控的。
上面的几个图看起来很高深,但那不是我们关心的问题,归根到底意思其实就是你想让错误率降低,就得增大数组的长度,就是这样。
我们使用BloomFilter的目的就是想省空间,所以我们需要做的就是在错误率上做个权衡就OK。
很多时候这个错误率我们是能接受的,譬如垃圾邮箱问题,是坏人一定会被抓,这个能保证。无非是一些好人也被抓,这个可以通过给这些可伶的被误伤的设置个白名单就OK。至于爬虫Url重复这个就更没问题了,会缺掉一些网页而已。
至于在缓存穿透上的应用,是为了避免恶意用户频繁请求缓存中不存在DB也不存在的值,会导致缓存失效、DB负载过大,可以使用BloomFilter把所有数据放到bit数组中,当用户请求时存在的值肯定能放行,部分不存在的值也会被放行,绝大部分会被拦截,这些少量漏网之鱼对于DB的影响就会比大量穿透好的多了。
讲了这么多,可以看到,原理很简单,但要实际做一个BloomFilter可就麻烦了,已经属于科学家的范畴了,好在早早有人已经搞定了java版的实现,用法很简单,下一篇看看。

使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重相关推荐

  1. REDIS13_缓存雪崩、缓存穿透、基于布隆过滤器解决缓存穿透的问题、缓存击穿、基于缓存击穿工作实际案例

    文章目录 ①. 缓存雪崩 ②. 缓存穿透 ③. 在centos7下布隆过滤器2种安装方式 ④. 缓存击穿 ⑤. 高并发的淘宝聚划算案例落地 ①. 缓存雪崩 ①. 问题的产生:缓存雪崩是指缓存数据大批量 ...

  2. 布隆过滤器解决缓存穿透_缓冲穿透/缓存击穿/缓存雪崩等问题解决办法

    ----------------------[感谢小昭提供的图片] 1.缓存穿透 定义:请求查询数据库中压根就不存在的数据,每次请求直接打在DB上,这种查询查询不存在数据的现象称为缓存穿透 穿透带来的 ...

  3. Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU

    啤酒理论 Buffer机制,减少没必要的来回调用 前置知识 只要和redis建立了连接,发送字符串,就能交互 管道 发布 / 订阅 help @pubsub 发送者 订阅者 PSUBSCRIBE pa ...

  4. 5redis-----------redis高级--GEO-查询附近的人、基数统计算法HLL 、布隆过滤器、缓存雪崩穿透击穿-------全栈式开发44

    redis高级 一.GEO查询附近的人 二.基数统计算法-HyperLogLog 三.布隆过滤器 四.缓存雪崩&缓存穿透 (一)缓存雪崩 (二)缓存穿透 (三)缓存击穿 一.GEO查询附近的人 ...

  5. 分布式之一行代码解决缓存击穿问题

    开局一张图,内容全靠编- 我只能说一言难尽--我只能说,感情影响了一名剑客拔剑的速度,就是这样! 引言 今天,重新回顾一下缓存击穿这个问题! 之所以写这个文章呢,因为目前网上流传的文章落地性太差(什么 ...

  6. BloomFilter 布隆过滤器

    BloomFilter 定义: 空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中 原理: 当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1.检索时 ...

  7. 谷粒商城 Day08 布隆过滤器与缓存切面

    Day08 布隆过滤器与缓存切面 一.答疑 使用HashMap本地缓存,是使用内存还是硬盘?如果使用内存,是不是程序重启了,缓存就丢失了? 二.业务中缓存使用总结&问题&面试题 1.数 ...

  8. 布隆过滤器Redis缓存穿透雪崩击穿热点key

    目录 布隆过滤器 Redis 缓存 穿透 雪崩 击穿 热点KEY 布隆过滤器 布隆过滤器(判断某个key一定不存在) 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 特点是高效地插入和查询, ...

  9. 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...

    Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...

最新文章

  1. maven在idea的配置
  2. 读取txt里面的数据进行计算
  3. 分享Kali Linux 2016.2第48周镜像文件
  4. python unpack函数_Python numpy.unpackbits函数方法的使用
  5. mysql里添加不了中文_为什么MySQL不能添加中文
  6. Java 成员变量和局部变量
  7. PPT幻灯片转换成word的软件
  8. asp.net中的窗体身份验证(分目录验证篇)
  9. 是否可以在最终课程中使用抽象方法?
  10. 独家:Havok 发布新的 AI 中间件
  11. 期刊投稿状态_这些SCI期刊的投稿显示状态是什么意思?
  12. 应力偏张量的物理意义_物理学中张量的由来
  13. SQL Server字符串左匹配
  14. Javascript 事件入门
  15. easyui下拉框,增加以及商品的上架,下架
  16. Java语言学习指导与习题解答_Java语言程序设计(第3版)学习指导与习题解析
  17. 电力设备管理杂志电力设备管理杂志社电力设备管理编辑部2022年第14期目录
  18. 永久免费!永洪科技发布桌面智能数据分析工具Desktop,推动数据应用平民化
  19. BT之家种子连接提取
  20. 今日新闻快讯摘要十条

热门文章

  1. outlook收件延迟严重_你(严重)对我不了解的五件事
  2. Spring的初始化和对象创建流程
  3. esp8266网络自动对时 串口字符连接 病显示 12864i2c u8g2库
  4. “独享宽带”是什么意思?
  5. QuickBooks 2016 for Mac(财务管理软件)
  6. c#五子棋实验报告_基于c#的五子棋游戏的设计与实现毕业论文.doc
  7. OpenWRT路由器使用ipv6拨号上网教程
  8. 2.1.3 毫米波雷达
  9. 一沙一世界(10亿光年),科学的图文介绍
  10. 恒讯科技分析:国内游戏服务器租用市场的大致情况怎么样呢?