门面模式(Facade)解析
参考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)解析的更多相关文章
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...
- 说说设计模式~门面模式(Facade)
返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...
- Tomcat源代码-门面模式(Facade)
从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...
- 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)
一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...
- c++ 门面模式(Facade)
门面模式是比较常用的一种设计模式,我们可能在无意中就会使用,门面模式就是用一个门面类来处理子系统的复杂关系,门面类简单的Api接口供客户端调用.用一个简单的演播室来表示. #include <i ...
- 学习笔记——门面模式Facade
门面模式,其实在我们不经意间已经使用了此设计模式.当我们需要将两个子系统,合并对外提供一个大的接口时,我们使用的就是门面模式.对外,子系统的接口是不可见的,只有我们的门面在.
- 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用
在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...
- php门面模式(facade pattern)
书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of ...
- JavaScript设计模式(6)-门面模式
门面模式 门面模式(Facade Pattern):他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接 ...
随机推荐
- hdu2141AC代码分享
#include <iostream> #include <algorithm> using namespace std; const int N = 505; /////// ...
- IOS 类似于网易新闻首页新闻轮播的组件
一.需求分析 1.可横向循环滚动新闻图片 2.滚动到对应图片时显示新闻标题 3.每张新闻图片可点击 4.有pageControl提示 5.具有控件的扩展能力 二.设计实现 1.显示图片使用SDWebI ...
- Gentoo网络配置
网卡识别配置 要开始配置你的网卡,你首先需要告诉Gentoo RC系统你的网卡. 可以用ifconfig命令查看自己网卡名字: ifconfig -a 网卡名字(如eth0)的识别是通过在/etc/i ...
- 用mybatis生成插件自动生成配置文件
1.在当前的maven项目的pom.xml中添加插件 <build> <plugins> <plugin> <groupId>org.mybatis.g ...
- Git 的 .gitignore 配置 转载
.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得. 1.配置语法: 以斜杠“/”开头 ...
- Windows文件监视器 1.0 绿色版
软件名称:软件名称: Windows文件监视器 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: 1 ...
- genymotion模拟器配置X86模拟器加速器
网上下载zip包 http://download.csdn.net/download/we5868123/9430140 直接拖进去即可,虚拟机不能使用管理员权限启动 名字为:解决genymotion ...
- Quicksum
Quicksum Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- wireshark 包过滤
tcp.port == 443 or udp.port==443 or tcp.port==53 or udp.port==53
- HDU 4329 MAP(stringstream的用法)
这个题目有点绕,但是按着他的意思写不难模拟出来.本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着... 赛后开始找原因,后来发现题目看错了,1/R中的R是 ...