最后就是测试类了
public static void main(String[] args) { RedisBloomFilter redisBloomFilter = new RedisBloomFilter(); int expectedInsertions = 1000; double fpp = 0.1; redisBloomFilter.delete("bloom"); BloomFilterHelper<CharSequence> bloomFilterHelper = new BloomFilterHelper<>(Funnels.stringFunnel(Charset.defaultCharset()), expectedInsertions, fpp); int j = 0; // 添加100个元素 List<String> valueList = new ArrayList<>(); for (int i = 0; i < 100; i++) { valueList.add(i + ""); } long beginTime = System.currentTimeMillis(); redisBloomFilter.addList(bloomFilterHelper, "bloom", valueList); long costMs = System.currentTimeMillis() - beginTime; log.info("布隆过滤器添加{}个值,耗时:{}ms", 100, costMs); for (int i = 0; i < 1000; i++) { boolean result = redisBloomFilter.contains(bloomFilterHelper, "bloom", i + ""); if (!result) { j++; } } log.info("漏掉了{}个,验证结果耗时:{}ms", j, System.currentTimeMillis() - beginTime); }
注意这里用的是addList,它的底层是pipelining管道,而add方法的底层是一个个for循环的setBit,这样的速度效率是很慢的,但是他能有返回值,知道是否插入成功,而pipelining是不知道的,所以具体选择用哪一种方法看你的业务场景,以及需要插入的速度决定 。。
布隆过滤器工作位置第一步是将数据库所有的数据加载到布隆过滤器 。第二步当有请求来的时候先去布隆过滤器查询,如果bf说没有,第三步直接返回 。如果bf说有,在往下走之前的流程 。ps:另外guava的数据加载中只有put方法,小伙们可以想下布隆过滤器中数据删除和修改怎么办,为什么没有delete的方法?
文章插图
布隆过滤器的其他应用场景
- 网页爬虫对URL去重,避免爬取相同的 URL 地址;
- 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱;
- Google Chrome 使用布隆过滤器识别恶意 URL;
- Medium 使用布隆过滤器避免推荐给用户已经读过的文章;
- Google BigTable,Apache HBbase 和 Apache Cassandra使用布隆过滤器减少对不存在的行和列的查找 。
推荐阅读
- 老虎究竟有几种类型?
- 太岁究竟是什么“东西”?我国科学家用精密仪器检测揭示太岁之谜
- 普洱茶选购标准,选购普洱茶生茶的绝招
- 牡丹花茶原料制作以及成分究竟是怎样的,玫瑰花茶到底是什么茶
- 变速箱的功能究竟是什么,汽车不要变速箱行不行?
- 汽车尾气排放究竟跟雾霾有多大关系
- 比亚迪的独门秘籍?DM-i超级混动技术究竟是什么?
- 阳历和阴历究竟有啥不同? 农历是阳历还是阴历
- 微信公众号阅读数分析的技巧是什么? 看看究竟该怎么做
- 铁观音究竟是属黄茶,黄茶白茶绿茶区别是什么