page contents

Bloomfilter清除数据的问题

Pack 发布于 2020-02-11 17:36
阅读 528
收藏 0
分类:数据库

我的应用中使用的bloomfilter的jar包依赖如下:


<dependency>   

<groupId>com.github.xuanyue202</groupId>

<artifactId>bloom-filter</artifactId>

<version>1.2.1</version>

</dependency>

布隆过滤器在SpringBoot中配置如下:


@Bean


public BloomFilter bloomFilter() {


logger.info("begin to init bloomfilter...");

BloomFilter<String> bloomFilter = new FilterBuilder(expectedElements, falsePositiveProbability)

.name(filterName) //use a distinct name

    .redisBacked(true)

    .redisHost(host) //Default is localhost

    .redisPort(port) //Default is standard 6379

    .buildBloomFilter();

logger.info("bloomfilter init successed.");

return bloomFilter;

}

`

在其他地方使用如下:


@Autowired

private BloomFilter<String> bloomFilter;

我的问题演进如下:

1.应用部署到3台机器了,应用启动后redis中有了设定的key;

2.一批数据第一次经过布隆过滤器,然后没有被拦截下来,写入到数据库;

3.同样的数据第二次经过布隆过滤器,能够被全部过滤下来,布隆过滤器工作正常;

4.此时我连接上redis服务器,通过命令删除上述的bloomfilter的key,再次让应用拿到同一批数据,此时布隆过滤器依然正常工作把数据都过滤了

5.三台机器的应用都重启,还是刚刚那批数据不会被布隆过滤器拦截(系统初始化,SpringBoot会再次执行上面的Bloomfilter的初始化);


我的问题是:

redis中bloomfilter的key被删除了而各个应用中布隆过滤器依然正常工作,工作完成之后,redis中这个key依然不存在。

1.那么三台机器中的bloomfilter不就是孤立的吗?不能进行数据交互了,是吧?

2.如何做到清除bloomfilter中的数据?(指定数据,或者全部数据都可以)

3.布隆过滤器工作的时候,不是先去redis中查询下,而是直接通过内存中已经存在的数据进行过滤?(这会不会存在一个漏洞?如果1号机已经将数据xxx过滤了,2号机又拿到了xxx数据,不是过滤不了?实际上我的测试效果是,只要1号机过滤过xxx数据,其他机器都是可以过滤的。)

最大的疑问在于,手动上redis服务器删除了key,布隆过滤器还能正常工作,工作完了后redis中不会新产生这个key。


期望:

哪位不吝赐教,把这个布隆过滤器工作过程中key被删除然后怎么工作的,分布式机器间如何继续共同协作来达到过滤讲清楚。(布隆过滤器的原理不用讲,这个大家都很清楚)。

谢谢!

326
Pack
Pack

xuanyue202提供的框架有错误,很明显三台服务器没有实时从redis获取数据。

请先 登录 后评论