为什么

就当前互联网环境来说,头部的互联网生态越来越往高并发、分布式的形态发展。举例来说,各大网页的黑名单系统,爬虫的重复率判断。这些场景越来越多。

举例来说,实时状态下可能会对超过百亿级别的 URL 需要进行判断是否符合规范或者存在于系统中,能否正常使用。

  • 通常情况下,每个 URL 的大小为 64B(字节),那么就按照100亿的 URL 数量来看,大概需要640GB的内存容量【】,对于当前线上服务器来说,… 这个值依然还是很大的!但如果利用布隆过滤器的优势,在没有失误率的情况下只需要100亿个比特,即:1.2GB,即使为了降低失误率,也不会超过几十GB的空间【失误率后面会谈到】

布隆过滤器的主要作用:判断一个元素是否在集合中

这样的场景会有很多。会去判断,要查询的元素是否存在于集合当中。【该网站是否允许该用户登录、该网站共是否接受这样的 url 请求】
通常在查询的时候,一般会先从 cache 中进行查询,如果没有的话会直接到磁盘或者数据库查询,这样的方式看起来很合理,但是如果在中间再加一层布隆顾虑器,这样就会更加合理了!为什么?

假设要查询的一个元素,而该元素不存在

  • 如果没有 BloomFilter,从cache中查询完就会直接到数据库做查询了,这样带来的现象是“慢”,毕竟从库中查耗时是比较长的,很大程度上对服务的性能产生影响。

  • 中间存在 BloomFilter,从cache中查询完就会首先查询 BloomFilter,就会发现该元素不存在,就可以不往后面进行查询了,而 BloomFilter 的性能是极其优越的。这样,对于机器或者说服务性能避免了很大不必要的消耗。

是什么

Bloom Filter是一种是一种空间效率高的概率型数据结构,专门用于判断某个元素是否存在于一个超大集合。集合载体是由01组成的向量图(bitMap),载体索引位置由一系列随机哈希函数计算而出。

判断规则:通过多个hash算法,为数据算出多个在bitmap中的索引位置,并将这多个索引位置的值都置为1。后续如果判断数据是否存在时,也判断这多个索引位的值是否都为1。如果都为1,则存在,有一个不为1,就说明不存在。

布隆过滤器用于检索一个元素是否存在于一个集合中,他的优点是空间占用和查询效率都比一般的算法好太多。并且因为布隆过滤器只存储01而不是具体的原值,在某些保密场合具有先天的优势。

bitmap的每一位都是一个bit,那么通过bitmap来存在10亿个位置,bitmap的大小为10亿/8/1024/1024 = 0.12G插入、查询的时间复杂度都是O(k),k为hash函数数量

布隆过滤器的缺点也相当明显:那就是他的准确率受制于他的算法限制,只能判断一个元素一定不存在于该集合,因为hash函数的碰撞,有些元素的所有hash下标位置和海量元素的共同hash计算下标位置结果相同而重置了所有位置,导致该元素不存在于该集合却误判为存在。

1、增大位图数组的大小(位图数组越大,占用的内存越大),减少hash碰撞
2、增加哈希函数的次数,而减少哈希碰撞:同一个key值经过1个函数相等了,那么经过2个或者更多个哈希函数的计算,都得到相等结果的概率就自然会降低了。

需要注意的是办法1会增加内存空间,而办法二会影响计算效率,因为时间复杂度为O(hash次数)

布隆过滤器的缺点二是:不能很轻易的删除掉元素

因为布隆过滤器的特性我知道,它们的下标位置计算可能是重复的,所以在删除下标位置的时候必须保证
该位置为该元素独享。而我们也可以把位列图转变为整数数组,每次下标的时候计算器+1,在删除一个元素
时在进行相应的扣减。但是我们必须保证这个元素是一定存在于这个集合中的,而布隆过滤器不能验证这点。

怎么用

java

  • 引入google的Guava
        <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version></dependency>
  • java
import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;public class GuavaBloomFilter {public static void main(String[] args) {// 总数量int total = 1000000;// 默认误判率fpp0.03//fpp:因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total);// 初始化 total 条数据到过滤器中for (int i = 0; i < total; i++) {bf.put("" + i);}// 判断值是否存在过滤器中int count = 0;for (int i = 0; i < total + 10000; i++) {if (bf.mightContain("" + i)) {count++;}}System.out.println("已匹配数量 " + count);// (1000309 - 1000000)/(1000000 + 10000) * 100 ≈ 0.030594059405940593//指定误判率:万分之一,提高匹配精度BloomFilter<CharSequence> bfWithFpp = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total, 0.0001);for (int i = 0; i < total; i++) {bfWithFpp.put("" + i);}int countFpp = 0;for (int i = 0; i < total + 10000; i++) {if (bfWithFpp.mightContain("" + i)) {countFpp++;}}//误判率 fpp 的值越小,匹配的精度越高。当减少误判率 fpp 的值,需要的存储空间也越大,所以在实际使用过程中需要在误判率和存储空间之间做个权衡。System.out.println("指定误判率已匹配数量 " + countFpp);// (1000001 - 1000000)/(1000000 + 10000) * 100 ≈ 0.0001}
}

fpp:
因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。

redis上的布隆过滤器(rebloom)

  • 下载
git clone git://github.com/RedisLabsModules/rebloom
cd rebloom
make
  • redis.conf配置文件中配置reloom文件下的rebloom.so 路径:loadmodule /path/rebloom.so
  • 重启redis,操作rebloom
[root@mysql01 ~]# redis-cli
127.0.0.1:6379> BF.add myBloom 1
127.0.0.1:6379> BF.add myBloom 2
127.0.0.1:6379> BF.exists myBloom 1

布隆过滤器(Bloom Filter)相关推荐

  1. mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  2. 布隆过滤器+布隆过滤器(Bloom Filter)详解

    布隆过滤器+布隆过滤器(Bloom Filter)详解 程序 = 数据结构 + 算法 -- 图灵奖得主,计算机科学家N.Wirth(沃斯) A Bloom filter is a space effi ...

  3. js 数组 实现 完全树_Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现 - 秋华...

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  4. Redis缓存穿透“新杀招“:布隆过滤器Bloom Filter

    场景分析 这篇文章来讲述缓存穿透的补充解决方案. 为什么要用补充来形容呢? 在之前的文章中,我们提到缓存穿透的解决方案时,我是这么说的: 关于缓存穿透,我们可以在用户访问数据库后将null值存入Red ...

  5. 布隆过滤器速度_布隆过滤器(Bloom Filter)详解

    布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...

  6. 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想

    转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  7. 布隆过滤器(Bloom Filter)原理及优缺点剖析

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...

  8. 布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...

  9. 布隆过滤器(Bloom Filter)的原理和实现

    布隆过滤器使用场景 之前在<数学之美>里面看到过布隆过滤器的介绍.那么什么场景下面需要使用布隆过滤器呢? 看下下面几个问题 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个 ...

  10. 布隆过滤器 Bloom Filter

    目录 一 前言 二 布隆过滤器 三 Redis实现 四 Guava实现 五 扩展知识点 一 前言 假如有一个15亿用户的系统,每天有几亿用户访问系统,要如何快速判断是否为系统中的用户呢? 方法一,将1 ...

最新文章

  1. 白盒测试的3中主要方法(cont.)
  2. 教程:6、打印文件和发送邮件
  3. 老李分享:shell 监控cpu,memory,load average 1
  4. 膨胀卷积(Dilated convolution)
  5. 【微信小程序】小程序之自定义头部导航栏背景图
  6. 新安搭信息快车建智慧城市
  7. pandas分组计算平均值_python – 如何计算在Pandas中另一列上分组的平均值
  8. 扫地机器人滤网顺序_扫地机器人如何维护 扫地机器人维护技巧【介绍】
  9. three.js 键盘w、s、a、d控制几何体移动
  10. RNN Attention
  11. 计算机使用快捷键大全
  12. ios共享账号公众号_新增iOS游戏账号共享06
  13. 为什么快捷指令无法将媒体转换为文本_小红书去水印快捷指令重磅更新,连视频封面图都可以下载了...
  14. 黑白双色背景图java_黄色背景黑白双色简洁ppt图表
  15. 驱动程序是如何驱动硬件的?
  16. 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native
  17. CSS课堂案例8-小米布局
  18. 自己动手搭建 Linux 0.12 编译环境 — Linux主机
  19. xxljob定时在sftp上传下载
  20. Aura Component Cope Snippets

热门文章

  1. 基于java的俄罗斯方块小游戏设计(含源文件)
  2. 愿有岁月可回首,更敬年少一杯酒
  3. 通读JavaScript红皮书(第二三章)
  4. 晚上可以挣钱的副业,这6个赶紧收藏吧!
  5. 第四章 DirectX 渲染流水线(上)
  6. 记一次完整的用户测试
  7. c语言程序设计作业电话簿,C语言设计简易电话簿
  8. fla文件与as文件之间的绑定
  9. BZOJ2668:[CQOI2012]交换棋子——题解
  10. Python AutoCAD 注释