参考:

https://www.jb51.net/article/248125.htm

https://blog.csdn.net/wang0112233/article/details/123665461

https://blog.csdn.net/qq_40179653/article/details/125716731

布隆过滤器简单来说就是:当它说这个数据存在时,其实可能不存在。如果是它说不存在时,那这个数据肯定不存在。

 

用例1: 假设项目已经集成了redisson

@Service
public class RedissonService{
@Autowired
private RedissonClient redissonClient;


/**
* 布隆过滤器,参数分别为: 过滤器的标识,大小,精度(如0.01代表有1%的误差)
* @return
*/
public RBloomFilter<Object> getBloomFilter(String str,long size,double precision) {
RBloomFilter<Object> bloomFilter = redissonClient.getBloomFilter(str);
bloomFilter.tryInit(size,precision);
return bloomFilter;
}
}

Controller中:
@GetMapping("/test2")
public Boolean test2(){
// 取布隆过滤器
RBloomFilter<Object> bloomFilter = redissonService.getBloomFilter("abc", 200, 0.01);
// 添加初始化的值
bloomFilter.add("abc");
// 验证是否命中 ,打印true 。 说明数据库中有此数据,先读redis,如果redis没有,则读数据库
System.out.println(bloomFilter.contains("abc"));
// 验证是否命中,打印false, 说明数据库中没有此数据,直接返回null就行, redis和数据库都不用读。
System.out.println(bloomFilter.contains("abcd"));
return Boolean.TRUE;
}


用例2:guava 工具包,这是谷歌公司提供的,里面也提供了布隆过滤器的实现。

public static void main(String[] args) {
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),100000,0.01);
// 初始化值
bloomFilter.put("10086");
// 打印false
System.out.println(bloomFilter.mightContain("123456"));
// 打印true
System.out.println(bloomFilter.mightContain("10086"));
}
posted on 2022-10-14 16:18  毛会懂  阅读(199)  评论(0编辑  收藏  举报