1、布隆过滤器是什么? 

  又快又小的处理方法
  布隆过滤器(Bloom Filter):是一种空间效率极高的概率型算法和数据结构,用于判断一个元素是否在集合中(类似Hashset)。
  它的核心一个很长的二进制向量和一系列hash函数

  数组长度以及hash函数的个数都是动态确定的。

  Hash函数:SHA1,SHA256,MD5..

2、应用的经典场景 

  一个像Yahoo,HotMail和Gmail那样的公众电子邮件提供商,
  总是需要过滤来自发送垃圾邮件的人的垃圾邮件,
  一个办法就是记录下那些发送垃圾邮件的email地址,
  由于那些发送者不停地再注册新的地址,全世界少说也有五十亿个发垃圾邮件的地址,
  怎么样迅速的判断一个邮件地址是不是垃圾邮件地址?把它存起来然后确认?

  一个邮箱平均18个字节,50亿个邮箱容量多大?
  18byte x 50亿 = 90亿

3、优势和劣势

  优势:
    全量存储但是不存储元素本身,在某些对保密要求非常严格的场合有优势;
    空间高效率
    插入/查询时间都是常数O(k),远远超过一般的算法

  劣势:
    存在误算率(False Positive),随着存入的元素数量增加,误算率随之增加;
    一般情况下不能从布隆过滤器中删除元素;
    数组长度以及hash函数个数确定过程复杂;

4、应用场景 

  •  Google著名的分布式数据库Bigtable以及Hbase使用了布隆过滤器来查找不存在的行或列,以及减少磁盘查找的IO次数
  •  文档存储检查系统也采用布隆过滤器来检测先前存储的数据
  •  Goole Chrome浏览器使用了布隆过滤器加速安全浏览服务
  •  垃圾邮件地址过滤
  •  爬虫URL地址去重
  •  解决缓存穿透问题

5、Bloom Filter实战

  使用goole guava轻松实现bloom filter
  源码分析 bitArray,numHashFunction,funnel,Strategy,put(),
  Demo实例
    场景描述:100w字符串放入布隆过滤器,另外随机生成1w字符串,判断他们在100w里面是否存在
    目的,了解布隆过滤器的简单使用;
    了解误判率对hash函数个数以及bit数组长度的影响
    使用bloom filter解决缓存击穿的问题

  

public class BloomFilterTest {

    private static final int insertions = 1000000; //100w

    @Test
public void bfTest(){
//初始化一个存储string数据的布隆过滤器,初始化大小100w,不能设置为0
BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), insertions,0.001);
//初始化一个存储string数据的set,初始化大小100w
Set<String> sets = new HashSet<>(insertions);
//初始化一个存储string数据的set,初始化大小100w
List<String> lists = new ArrayList<String>(insertions); //向三个容器初始化100万个随机并且唯一的字符串---初始化操作
for (int i = 0; i < insertions; i++) {
String uuid = UUID.randomUUID().toString();
bf.put(uuid);
sets.add(uuid);
lists.add(uuid);
} int wrong = 0;//布隆过滤器错误判断的次数
int right = 0;//布隆过滤器正确判断的次数
for (int i = 0; i < 10000; i++) {
String test = i%100==0?lists.get(i/100):UUID.randomUUID().toString();//按照一定比例选择bf中肯定存在的字符串
if(bf.mightContain(test)){
if(sets.contains(test)){
right ++;
}else{
wrong ++;
}
}
} System.out.println("=================right====================="+right);//
System.out.println("=================wrong====================="+wrong);
} }

6、解决缓存击穿

private BloomFilter<String> bf;

@postConstruct  ------------->初始化的方法
private void init(){
//将唯一编码加进来
//初始化布隆过滤器
bf = BloomFiler.create(Funnels.stringFunner(Charsets.UTF_8),编码.size()*1.2);
for(String str:ucodes){
bf.put(str);
}
========将布隆过滤器的数据放到单个服务,和业务代码分开
使用多线程放进去
if(bf.mightContain(usercode)){
return null;
}

本次布隆过滤器落地场景是:优化关联查询

优化背景:查询订单需要关联预警订单数据,由于每查询一笔预警就要查询一次预警表,效率低,即是判断该订单是否预警

可以先将预警的订单放到布隆过滤器中存放一份,则查询订单的时候可以用于关联

应用该场景的原因:大部分订单还是正常的,所以没不要每次去关联

先去布隆过滤器查询该订单是否存在,不存在则直接返回正常,存在则去预警表查询,允许一定的误差率

  

Bloom Filter的应用的更多相关文章

  1. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  2. 探索C#之布隆过滤器(Bloom filter)

    阅读目录: 背景介绍 算法原理 误判率 BF改进 总结 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构.通俗来说就是在大数据集合下高效判断某个成员是 ...

  3. Bloom Filter 布隆过滤器

    Bloom Filter 是由伯顿.布隆(Burton Bloom)在1970年提出的一种多hash函数映射的快速查找算法.它实际上是一个很长的二进制向量和一些列随机映射函数.应用在数据量很大的情况下 ...

  4. Bloom Filter学习

    参考文献: Bloom Filters - the math    http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html    B ...

  5. 【转】探索C#之布隆过滤器(Bloom filter)

    原文:蘑菇先生,http://www.cnblogs.com/mushroom/p/4556801.html 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量 ...

  6. bloom filter

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员. 结    构 二进制 召回率 ...

  7. Bloom Filter 概念和原理

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员.如果检测结果为是,该元素不一定 ...

  8. 【转】Bloom Filter布隆过滤器的概念和原理

    转自:http://blog.csdn.net/jiaomeng/article/details/1495500 之前看数学之美丽,里面有提到布隆过滤器的过滤垃圾邮件,感觉到何其的牛,竟然有这么高效的 ...

  9. [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen

            Url Seen用来做url去重.对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键.因为大的爬虫系统可能一秒钟就会下载 ...

  10. bloom filter 详解[转]

    Bloom Filter概念和原理 焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom ...

随机推荐

  1. 关于Yarn源码那些事-前传之ResourceManager篇(一)初始化

    在关于Yarn那些事的博客里,介绍的主要是针对任务提交的一个动态流程说明,而其中牵涉到的一些细节问题,必须通过Resourcemanager的启动和NodeManager的启动,来更好的说明. 而本系 ...

  2. POJ 2186 受欢迎的牛 Tarjan基础题

    #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #inc ...

  3. json数据格式的简单案例

    json数据是一种文本字符串,它是javascript的原生数据格式,在数据需要多次重复使用时,json数据是ajax请求的首先.(注:ajax返回的数据格式支持三种分别为:文本格式,json.和xm ...

  4. spring in action 学习笔记十:用@PropertySource避免注入外部属性的值硬代码化

    @PropertySource的写法为:@PropertySource("classpath:某个.properties文件的类路径") 首先来看一下这个案例的目录结构,重点看带红 ...

  5. Waifu2x测试

    真的是好玩..给大家(?)提供一个能用Waifu2x upscale的图片类型集合.. 上面是原图下面是Upscaled..因为是png大家自行下载对比..

  6. js中字符串常规操作

    string对象属性: 1.length 获取字符串的长度,需要注意的是,js中中文每个汉字也只代表一个字符. var myName="xulinjun"; console.log ...

  7. (原创)Linux下MySQL 5.5/5.6的修改字符集编码为UTF8(彻底解决中文乱码问题)

    « CloudStack+XenServer详细部署方案(10):高级网络功能应用 (总结)CentOS Linux 5.x在GPT分区不能引导的解决方法 » 2013-1 11 (原创)Linux下 ...

  8. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  9. 【SSH原理】ssh用法及命令

    什么是SSH? Secure Shell  安全外壳协议 简单说,SSH是一种网络协议,用于 计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登 ...

  10. 用 gdb 调试 GCC 程序【转】

    用 GDB 调试程序 原著:Rick McMullin 用 gdb 调试 GCC 程序 转自:http://blog.csdn.net/bonnshore/article/details/795542 ...