布隆过滤器(Bloom Filter)
为什么
就当前互联网环境来说,头部的互联网生态越来越往高并发、分布式的形态发展。举例来说,各大网页的黑名单系统,爬虫的重复率判断。这些场景越来越多。
举例来说,实时状态下可能会对超过百亿级别的 URL 需要进行判断是否符合规范或者存在于系统中,能否正常使用。
- 通常情况下,每个 URL 的大小为 64B(字节),那么就按照100亿的 URL 数量来看,大概需要640GB的内存容量【】,对于当前线上服务器来说,… 这个值依然还是很大的!但如果利用布隆过滤器的优势,在没有失误率的情况下只需要100亿个比特,即:1.2GB,即使为了降低失误率,也不会超过几十GB的空间【失误率后面会谈到】
布隆过滤器的主要作用:判断一个元素是否在集合中
这样的场景会有很多。会去判断,要查询的元素是否存在于集合当中。【该网站是否允许该用户登录、该网站共是否接受这样的 url 请求】
通常在查询的时候,一般会先从 cache 中进行查询,如果没有的话会直接到磁盘或者数据库查询,这样的方式看起来很合理,但是如果在中间再加一层布隆顾虑器,这样就会更加合理了!为什么?
假设要查询的一个元素,而该元素不存在
如果没有 BloomFilter,从cache中查询完就会直接到数据库做查询了,这样带来的现象是“慢”,毕竟从库中查耗时是比较长的,很大程度上对服务的性能产生影响。
中间存在 BloomFilter,从cache中查询完就会首先查询 BloomFilter,就会发现该元素不存在,就可以不往后面进行查询了,而 BloomFilter 的性能是极其优越的。这样,对于机器或者说服务性能避免了很大不必要的消耗。
是什么
Bloom Filter是一种是一种空间效率高的概率型数据结构,专门用于判断某个元素是否存在于一个超大集合。集合载体是由01组成的向量图(bitMap),载体索引位置由一系列随机哈希函数计算而出。
判断规则:通过多个hash算法,为数据算出多个在bitmap中的索引位置,并将这多个索引位置的值都置为1。后续如果判断数据是否存在时,也判断这多个索引位的值是否都为1。如果都为1,则存在,有一个不为1,就说明不存在。
布隆过滤器用于检索一个元素是否存在于一个集合中,他的优点是空间占用和查询效率都比一般的算法好太多。并且因为布隆过滤器只存储01而不是具体的原值,在某些保密场合具有先天的优势。
bitmap的每一位都是一个bit,那么通过bitmap来存在10亿个位置,bitmap的大小为10亿/8/1024/1024 = 0.12G插入、查询的时间复杂度都是O(k),k为hash函数数量
布隆过滤器的缺点也相当明显:那就是他的准确率受制于他的算法限制,只能判断一个元素一定不存在于该集合,因为hash函数的碰撞,有些元素的所有hash下标位置和海量元素的共同hash计算下标位置结果相同而重置了所有位置,导致该元素不存在于该集合却误判为存在。
1、增大位图数组的大小(位图数组越大,占用的内存越大),减少hash碰撞
2、增加哈希函数的次数,而减少哈希碰撞:同一个key值经过1个函数相等了,那么经过2个或者更多个哈希函数的计算,都得到相等结果的概率就自然会降低了。
需要注意的是办法1会增加内存空间,而办法二会影响计算效率,因为时间复杂度为O(hash次数)
布隆过滤器的缺点二是:不能很轻易的删除掉元素
因为布隆过滤器的特性我知道,它们的下标位置计算可能是重复的,所以在删除下标位置的时候必须保证
该位置为该元素独享。而我们也可以把位列图转变为整数数组,每次下标的时候计算器+1,在删除一个元素
时在进行相应的扣减。但是我们必须保证这个元素是一定存在于这个集合中的,而布隆过滤器不能验证这点。
怎么用
java
- 引入google的Guava
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version></dependency>
- java
import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;public class GuavaBloomFilter {public static void main(String[] args) {// 总数量int total = 1000000;// 默认误判率fpp0.03//fpp:因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total);// 初始化 total 条数据到过滤器中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);// (1000309 - 1000000)/(1000000 + 10000) * 100 ≈ 0.030594059405940593//指定误判率:万分之一,提高匹配精度BloomFilter<CharSequence> bfWithFpp = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total, 0.0001);for (int i = 0; i < total; i++) {bfWithFpp.put("" + i);}int countFpp = 0;for (int i = 0; i < total + 10000; i++) {if (bfWithFpp.mightContain("" + i)) {countFpp++;}}//误判率 fpp 的值越小,匹配的精度越高。当减少误判率 fpp 的值,需要的存储空间也越大,所以在实际使用过程中需要在误判率和存储空间之间做个权衡。System.out.println("指定误判率已匹配数量 " + countFpp);// (1000001 - 1000000)/(1000000 + 10000) * 100 ≈ 0.0001}
}
fpp:
因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。
redis上的布隆过滤器(rebloom)
- 下载
git clone git://github.com/RedisLabsModules/rebloom
cd rebloom
make
- redis.conf配置文件中配置reloom文件下的rebloom.so 路径:loadmodule /path/rebloom.so
- 重启redis,操作rebloom
[root@mysql01 ~]# redis-cli
127.0.0.1:6379> BF.add myBloom 1
127.0.0.1:6379> BF.add myBloom 2
127.0.0.1:6379> BF.exists myBloom 1
布隆过滤器(Bloom Filter)相关推荐
- mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- 布隆过滤器+布隆过滤器(Bloom Filter)详解
布隆过滤器+布隆过滤器(Bloom Filter)详解 程序 = 数据结构 + 算法 -- 图灵奖得主,计算机科学家N.Wirth(沃斯) A Bloom filter is a space effi ...
- js 数组 实现 完全树_Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现 - 秋华...
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- Redis缓存穿透“新杀招“:布隆过滤器Bloom Filter
场景分析 这篇文章来讲述缓存穿透的补充解决方案. 为什么要用补充来形容呢? 在之前的文章中,我们提到缓存穿透的解决方案时,我是这么说的: 关于缓存穿透,我们可以在用户访问数据库后将null值存入Red ...
- 布隆过滤器速度_布隆过滤器(Bloom Filter)详解
布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...
- 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想
转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html 布隆过滤器[1](Bloom Filter)是由布隆(Burton ...
- 布隆过滤器(Bloom Filter)原理及优缺点剖析
直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...
- 布隆过滤器Bloom Filter简介
背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...
- 布隆过滤器(Bloom Filter)的原理和实现
布隆过滤器使用场景 之前在<数学之美>里面看到过布隆过滤器的介绍.那么什么场景下面需要使用布隆过滤器呢? 看下下面几个问题 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个 ...
- 布隆过滤器 Bloom Filter
目录 一 前言 二 布隆过滤器 三 Redis实现 四 Guava实现 五 扩展知识点 一 前言 假如有一个15亿用户的系统,每天有几亿用户访问系统,要如何快速判断是否为系统中的用户呢? 方法一,将1 ...
最新文章
- 白盒测试的3中主要方法(cont.)
- 教程:6、打印文件和发送邮件
- 老李分享:shell 监控cpu,memory,load average 1
- 膨胀卷积(Dilated convolution)
- 【微信小程序】小程序之自定义头部导航栏背景图
- 新安搭信息快车建智慧城市
- pandas分组计算平均值_python – 如何计算在Pandas中另一列上分组的平均值
- 扫地机器人滤网顺序_扫地机器人如何维护 扫地机器人维护技巧【介绍】
- three.js 键盘w、s、a、d控制几何体移动
- RNN Attention
- 计算机使用快捷键大全
- ios共享账号公众号_新增iOS游戏账号共享06
- 为什么快捷指令无法将媒体转换为文本_小红书去水印快捷指令重磅更新,连视频封面图都可以下载了...
- 黑白双色背景图java_黄色背景黑白双色简洁ppt图表
- 驱动程序是如何驱动硬件的?
- 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native
- CSS课堂案例8-小米布局
- 自己动手搭建 Linux 0.12 编译环境 — Linux主机
- xxljob定时在sftp上传下载
- Aura Component Cope Snippets