布隆过滤器究竟是什么,这一篇给讲的明明白白的( 五 )

最后就是测试类了
    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使用布隆过滤器减少对不存在的行和列的查找 。
好了,布隆过滤器到这里就结束了,以后在面试中面试官在问到缓存击穿怎么办,我相信你应该能够回答的头头是道了,就像我这样通俗易懂的说出来即可,然后在工作中也可以应用,比如鉴权服务,当用户登录的时候可以先用布隆过滤器判断下,而不是直接去redis、数据库查




推荐阅读