guava实现了布隆过滤器我们直接使用即可:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>版本自取</version>
</dependency>
然后直接用:
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.Objects;
public class Test {
//预计要插入多少数据
private static int size = 1000000;
//期望的误判率
private static double fpp = 0.01;
//布隆过滤器
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, fpp);
public static void main(String[] args) {
//插入数据
for (int i = 0; i < 1000000; i++) {
bloomFilter.put(i);
}
double count = 0;
//测试误判率
for (int i = 1000000; i < 2000000; i++) {
if (bloomFilter.mightContain(i)) {
count++;
}
}
System.out.println("总共的误判率:" + count/1000000);
}
// 以下为伪代码
public String getObject(String key) {
String value = redis.get(key);
if (Objects.isNull(value)) {
// redis中不存在该缓存
if(!bloomFilter.mightContain(key)){
//布隆过滤器也没有,直接返回
return null;
}else{
//布隆过滤器中能查到,不代表一定有,查出来放入redis
value = db.get(key);
redis.set(key, value);
}
}
return value;
}
}