1.布隆过滤器简介
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难
重点 :
二进制向量 : 二进制的方式存放数据
随机映射函数 : 多次运算算出位数
误判率 : 算出有不一定有 , 算出 没有 一定 没有
删除困难 : 多次hash 导致删除麻烦
布隆过滤器不存放数据 , 只存放数据经过运算后的值
经过m次运算后 把对应bit位设置为1
2.java实现布隆过滤器方式
分布式布隆过滤器 :
redis实现
1.bit实现
2.redis插件实现(4.0之后) https://www.codercto.com/a/87070.html
本地布隆过滤器 :
guava实现
3.guava使用布隆过滤器
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
创建布隆过滤器方法
public static <T> BloomFilter<T> create(
Funnel<? super T> funnel, int expectedInsertions, double fpp) {
funnel : 添加数据的接口
expectedInsertions : 预计添加多少数据
fpp : 能接受的误判率
//创建
BloomFilter<String> filter = BloomFilter.create(new Funnel<String>() {
@Override
public void funnel(String from, PrimitiveSink into) {
System.out.println("testadd");
into.putString(from, Charsets.UTF_8);
}
}, 50, 0.1);
//添加元素
filter.put("test");
//判断元素是否存在
boolean test = filter.mightContain("test");
//把另一个布隆过滤器的数据加进来
filter.putAll();
4.redis使用布隆过滤器
1.redis布隆过滤器实体类创建
import com.google.common.hash.Funnels;
import com.google.common.hash.Hashing;
import com.google.common.primitives.Longs;