一.概述bloom滤波器的基础是位图(位数组)的数据结构,它用k个散列函数将此元素映射到位数组的k个点,并将他们设置为1。 检索时,通过调查这k个点是否都为1,可以判断元素是否在BloomFilter中(有一定的误差率)。 如果k个点中有1以外的点,则此元素一定不在bloom过滤器中。 的大致数据结构:
2 .使用场景1 .删除海量数据
2 .处理缓存直通模式的场景检查所请求的key是否存在
三.使用demo guava的bloom过滤器包
package com.vip.learn.guava; import com.Google.com mon.hash.bloom filter; import java.nio.charset.Charset;/* * * createdbyandrew.Huang on 2019/6/3 */publicclassbloomfiltermain { publicstaticvoidmain [ ] args } { bloomfiltersters } into ) ) into.putstring ) from,Charset.defaultCharset,32 * 1024 * 1024L,0.01d; for(intI=0; i 10; I ) bloom filter.put (thread.current thread ().getName ) ) I ); } system.out.println (bloom filter.might contain ('1' ); system.out.println (bloom filter.might contain (thread.current thread ) ).getName ) ('1' ); }输出结果:
四. guava bloomFilter原理1.BloomFilter.create (
)1)首先查看官方api文档对create四种方法的说明
主要三个参数:
*如何将数据插入funnel : bloom过滤器
* expected insertions :期待bloom filter中包含的元素的个数
* fpp (灵活可处理性) :错误允许率
)2)探究底层bloom过滤器如何根据这些参数处理
bloom过滤器在此可以看到您使用的是bloomfilterstrategies.murmur 128 _ mitz _ 64策略类
的numBits和numHashFunctions获取是基于数学理论计算的,如果有兴趣,可以知道https://blog.csdn.net/v _ July _ v/article/details/6685894
2.BloomFilter.put ()方法
可以看到bloom过滤器实际上是在strategy类中实现的,真正的put方法是
点击查看,该类主要通过murmur3_128的混列函数获取混列,并根据混列函数的数量执行k次混列算法对值进行put
3.BloomFilter.mightContains ()方法
在k个混列算法中,如果从一个BitArray.get ) )获得的返回值不是true (即,在该元素的位置不是1 ),则可以看到它返回false
4.guava bloom过滤器的缺点
不能删除元素。 必须估计容量,然后设置bloom过滤器
五、bloom滤波器实现的关键在于位数组容量大小、允许率数值和混列函数的选择,在允许一定概率的错误率的情况下,可以有效处理大量数据的抽取和判定。
from:andrew.huang