参考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. C++ 内存分析-valgrind

    valgrind包括了以下几个比较重要的模块:memcheck, cachegrind, callgrind, helgrind, drd, massif, dhat, sgcheck, bbv. 还 ...

  2. 自己写deque

    //deque /* what is a deque? In Chinese, it's called "双端队列". It's different from a queue. I ...

  3. LeetCode OJ 169. Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  4. hdu2063 匈牙利算法 二分最大匹配模版题

    过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class na ...

  5. poj2140(奇因数的个数)

    #include<stdio.h>int main(){ int n,s=0; scanf("%d",&n); for(int i=1;i<=n;i++) ...

  6. linux ssh连接不自动断开

    修改linux服务器ssh配置文件: vim /etc/ssh/ssh_config 修改两处的值为: ClientAliveInterval ClientAliveCountMax 使修改的ssh配 ...

  7. A - 小彭玉的扫荡食堂计划

    A - 小彭玉的扫荡食堂计划 Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  8. 免费开源的boostrap模板

    百度查不到,奶奶的,百度好多国外技术类文章的都查不到 https://colorlib.com/wp/free-html5-admin-dashboard-templates/ 有没有FQ软件介绍呀?

  9. WebService使用入门(包括发布服务,调用服务)

    WebService是基于SOAP协议的,全称是Simple Object Access Protocol(简单对象访问协议). SOAP不是什么神奇的东西,等于HTTP+XML,即在HTTP协议的基 ...

  10. ubuntu如何实现访问实际网络中windows共享文件夹

    方法一: 首先在建立一个挂载目录. sudo mkdir /mnt/share 然后就把共享目录持载进去. 服务器:192.168.6.84 共享名:gg 用户名:administrator 密 码: ...