布隆过滤器是什么git
在作JAVA项目时候用到这个(参考地址),今天我们就讲一讲github
名字就跟每一个定律同样,你问为何叫牛顿定律,由于是牛顿发明或者发现的。redis
他能作什么?它是将一个二进制向量和函数映射,布隆过滤器能够用在检测元素是否存在某个集合或者用于快速检索中。算法
缺点: 有必定的删除问题和错误识别率数据库
优势:查询时间和空间都远远超过普通算法后端
布隆过滤器Bloom Filter 是怎么实现的数组
添加Item或者元素时,建立一个散列函数和一个KEY造成映射,设置的数据=1,只要检索时判断 =1就知道这个数据存不存在,有了此方法,查询时发现有0的则证实必定不存在,那么反过来说若是是1证实元素极可能存在,缓存
注意这里为何说极可能存在,由于他有必定的识别错误,但这个错误在实际生产过程当中能够忽略,毕竟利大于弊么。服务器
看文字晕晕乎乎,不动就画图,来看看应该就会明白许多。maven
说人话
布隆过滤器到底能干啥?
特殊的id暂且不提哈,数据库id基本都是自增的对吧!咱们传递id后端去DB查询,这个很是合理。
可是若是咱们用负数查询呢?一两条无所谓,若是成千上万呢?基本上数据库都会很大压力扛不住,服务器配置暂且不说,拖慢系统运行速度甚至宕机都是有可能的,这样是否是布隆过滤器的有点有展示的淋漓尽致。【狗头】
这么吊,也是有代价的,由于它也拿不许,存在必定程度的判断失误!
问:为何会误判?
答:搜索的key没在容器中,可是hash后获得的key都是1 。假如布隆过滤器中有黑名单,那么直接建立一个白名单就搞定了。
问:为何不容易删除?
答:咱们提到正确的数据Key值=1,但不能由于=0就删掉他,这可能会影响其余元素的判断 不过能够了解下Counting Bloom Filter 「下一篇文章」
说了这么多咋实现
1:预估数量n以及指望的误判率FPP
2: hash函数和bit集合的size大小
Bit集合Size大小
函数 哈希选择,预估值n和bit数组长度m获取hash函数Key
怎么用?maven项目中添加
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>
一段我写的测试代码
/** * 布隆过滤器 - 用于redis缓存穿透 的状况 public class TestBloomFilterByDZZ { private static int total = 19999; private static BloomFilter<Integer> bfilter = BloomFilter.create(Funnels.integerFunnel(), total); // 初始化数据 public static void main(String[] args) { for (int i = 0; i < total; i++) { bfilter.put(i); } // 是否有匹配不上的 for (int i = 0; i < total; i++) { if (!bfilter.mightContain(i)) { System.out.println("有没关注西北大粽子的 溜了。。。"); } } // 再也不内的有多少匹配出来 int count = 0; for (int i = total; i < total + 10000; i++) { if (bfilter.mightContain(i)) { count++; } } System.out.println("炮灰陪跑:" + count); } }
可适用的业务场景
1:当一个入库数据量比较大的时候,能够用做名称或者惟一件作检查,存在则跳过不存在则入库
2:过滤垃圾邮件,这是一段计算你能够结合本身的业务了解下。
平常求关注,在被业务折磨的状况下还能留下点什么。