参考https://juejin.im/post/5de1e37c5188256e8e43adfc

什么是布隆过滤器?

布隆过滤器本质上是一个很长的位数组和一系列哈希函数。位数组元素一开始全是0。往布隆过滤器里放元素时,假如有n个哈希函数,则先用这n个哈希函数处理元素,得到n个数字,然后把数组对应索引处设置为1,比如说1、3、5位置设置成1。元素量大时,难免会发生哈希碰撞,这样后面的1就会覆盖前面的1。布隆过滤器的特性是能够判定某个元素不存在,但不能判定某个元素存在。一个元素,通过哈希函数算出几个数,这些对应索引位置处只要有一个是0,就表示不存在,因为假如存在的话,那些对应索引位置必然都是1。另外,即使那些对应索引位置都是1,也不能判定该元素存在,因为这些索引位置的1可能是存放其他元素时设置的。

布隆过滤器的应用场景。

在很大量很大量的数据集里判定某一个数据不存在。如果接受一定错误率的话,还可以用来判定某一个数据存在。在其他常见方法,比如说放到Set中用contains判断、存到数据库中查询、存到es中查询,这些方法因为数据量太大而不得不放弃时,就可以考虑用布隆过滤器了。

布隆过滤器为什么能支持大量的数据呢?因为它存放的不是这些数据集本身,而是这些根据这些数据集去设置位数组的值,而位数组占用内存空间很小,且位数组的大小在创建布隆过滤器时就指定了,不管存再多数据,都不会再变了。

布隆过滤器的几种实现

1、guava实现

布隆过滤器用BloomFilter表示。

使用示例:

    public static void main(String[] args) {
int total = 100000000;
BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total, 0.0001);
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);
}

调用BloomFilter的create静态方法可以创建布隆过滤器,支持泛型。上例就是原始数据是字符串类型的场景,布隆过滤器可以支持任意类型的数据,除了常见的数字、字符串之外,甚至还支持图片、音视频等等,因为它的泛型可以支持byte[],而任意类型的数据都可以转成byte[]。创建布隆过滤器时还可以指定错误率,默认是0.03,即3%,这个数字有点大,业务上我们一般要求4个9的正确率,即99.99%,所以可以指定错误率为0.0001,像上例中一样。

2、redis

利用redis实现,需要在redis服务端上安装一个叫做RedisBloom的插件,且要求redis版本在4.0以上,这两个要求比较严苛,实际操作性不强,只有在单机的guava实现不满足业务需求的时候,才考虑用redis实现。本处不详细讲解,知道用redis可以实现就行。

门面模式(Facade)解析的更多相关文章

  1. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式   意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...

  2. 说说设计模式~门面模式(Facade)

    返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...

  3. Tomcat源代码-门面模式(Facade)

    从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...

  4. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)

    一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...

  5. c++ 门面模式(Facade)

    门面模式是比较常用的一种设计模式,我们可能在无意中就会使用,门面模式就是用一个门面类来处理子系统的复杂关系,门面类简单的Api接口供客户端调用.用一个简单的演播室来表示. #include <i ...

  6. 学习笔记——门面模式Facade

    门面模式,其实在我们不经意间已经使用了此设计模式.当我们需要将两个子系统,合并对外提供一个大的接口时,我们使用的就是门面模式.对外,子系统的接口是不可见的,只有我们的门面在.

  7. 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用

    在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...

  8. php门面模式(facade pattern)

    书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of ...

  9. JavaScript设计模式(6)-门面模式

    门面模式 门面模式(Facade Pattern):他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接 ...

随机推荐

  1. .Net Core 上传图片

    /// <summary> /// 图片上传并存入数据库 /// </summary> /// <returns></returns> public J ...

  2. MySQL 的一个Bug?

    在 my.ini 中的 [mysqld] 段设置 mysql basedir 和 datadir,如下: #Path to installation directory. All paths are ...

  3. linux服务器被攻击处理过程

    开始排查 首先检查日志,以前做过安全运维,所以写过类似于检查命令和工具,开始一一排查. #查看是否为管理员增加或者修改 find / -type f -perm #显示文件中查看是否存在系统以外的文件 ...

  4. MATLAB将变量存储到EXCEL

    代码如下: d = {'Time','Temperature'; 12,98; 13,99; 14,97}; xlswrite('testdata2.xls', d, 1, 'E1') 运行如下:

  5. 写一个CGI程序并运行

    准备Linux和Apache我在/var/www/cgi-bin/下建一个文件get.c #include <stdio.h> #include <stdlib.h> int ...

  6. 解决网页在手机浏览器打开不停刷新的方案(百度的ua自动转向js问题)

    一:发现问题 原有可能是网站内挂了一个百度的ua自动转向js,手机访问的话会被自动转到feiyujd.com,然后又被转到www点feiyujd点com,这样反复死循环.就形成了一直在刷新,网站一闪一 ...

  7. python&MongoDB

    1 #!/usr/bin/python 2 #-*- coding:utf-8 3 import pymongo 4 connection=pymongo.MongoClient() 5 tdb=co ...

  8. DateUtils时间工具类探究

    首先声明一下,这个DateUtils工具类不是自己写的,而是在commons-lang-2.Xjar包或是commons-lang3-3.X.jar包中,具体在哪个jar包中,看程序具体添加了哪个版本 ...

  9. RSA 公私钥 互换问题

    关于 RSA,我的理解是: 按定义的话,公私钥是可以互换的 问题是常见的实现里面,保存“私钥”的那个数据结构或者文件,里面除了私钥所必需的那一对数之外,还有额外的信息(足以算出公钥来),所以绝对不能把 ...

  10. 滚动条加粗和panel,gridControl结合用

    private void FrmLotterycs_Load(object sender, EventArgs e) { t = 0; UserJuanquanTB = O.get_UserJuanq ...