门面模式(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):他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接 ...
随机推荐
- putty完全使用手册--多窗口---git提交---连接数据库--自动日志显示
01 putty dev 192.168.3.38 02 cd /home/gongfu/tripb/cranedev02.1 git status git add git commit git pu ...
- 一、ASP.NET Routing路由(深入解析路由系统架构原理)
阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...
- linux命令 time
功能:用于计算命令执行的世界 语法: time command 例如: hbg@root:~/dl$ time ls111 apple.sh b.txt duplic ...
- JSON.parse()和JSON.stringify()&&traditional(ajax请求)的作用
parse是一个字符串中解析出json对象,如 var str = '{"name":"haizeiwang"}' 结果: JSON.parse(str) na ...
- crontab定时任务
使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过cro ...
- NOTE07152246 JAVA 发展及JDK配置
一.软件工程师体系: 操作系统(Windows/Linux/Unix) - 数据库系统 - 中间件(WebSphere/Tomcat) - JAVA EE 1.操作系统为用户构建了一个平台.此平台上可 ...
- SQL函数学习(四):charindex()函数
秒懂例子: CHARINDEX('SQL', 'Microsoft SQL Server') 返回11: CHARINDEX('7.0', 'Microsoft SQL Server 2000') 返 ...
- nginx(ubuntu)设置别名访问目录
1 2 3 4 5 6 7 8 9 10 11 12 13 location /phpmyadmin/ { alias /data/phpmyadmin/; index index.html in ...
- 关于PS的一些总结
1.设计给的图,单独用里边的个别图层 打开图 — 新建一个图层(ctrl+n) — (点开上面的窗口排列-垂直排列,左下边下边自动选择改成图层)—选择移动工具,选中要移动的图层,拉到新建文件夹中. ...
- javaweb学习总结——Filter高级开发
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...