ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-分布式环境中的Bloom过滤器

2019-11-09 02:03:32  阅读:212  来源: 互联网

标签:bloom-filter search distributed-system java


我有一个由一些用Java编写的应用程序实例组成的系统.对它们的请求是负载均衡的,以实现高可用性.每秒,这个“集群”接收数百个小数据块(每个数据块由几个简单的字符串组成),存储在数据库中,保存几天,然后丢弃.除了存储此数据外,主要要求是快速确定给定值是否存储在数据库中.适当地建立索引和分区的数据库表似乎适合该问题,并且至少目前就可以很好地工作.

问题是,大约80%的搜索值未找到,因为它们不在数据库中.因此,我想加快速度,并加快搜索速度,减少资源消耗.布隆过滤器将是显而易见的选择,如果不是因为不同的应用程序实例接收到不同部分的数据,并且如果每个应用程序实例在布隆过滤器中只有一部分数据,那么这些布隆过滤器就没有用了.

您对如何解决此问题有任何建议/想法吗?

解决方法:

kept for a couple of days and then discarded

Bloom过滤器不支持删除对象,仅支持插入.
如果有多个Bloom筛选器,则必须全部查询它们,以检查其中之一是否包含所需的对象.

如果乳清具有相同的结构(相同的大小,相同的哈希函数等),则可以有效合并Bloom过滤器.

您可以使用以下Bloom过滤器:
https://github.com/odnoklassniki/apache-cassandra/blob/master/src/java/org/apache/cassandra/utils/BloomFilter.java

并合并两个过滤器,如下所示:

BloomFilter merge(BloomFilter dstFilter, BloomFilter srcFilter) {
    OpenBitSet dst = dstFilter.bitset;
    OpenBitSet src = srcFilter.bitset;

    for (int i = 0; i < src.getPageCount(); ++i) {
        long[] dstBits = dst.getPage(i);
        long[] srcBits = src.getPage(i);

        for (int j = 0; j < srcBits.length; ++j) {
            dstBits[j] |= srcBits[j];
        }
        dst.setPage(i, dstBits);
    }
    return dstFilter;
}

标签:bloom-filter,search,distributed-system,java
来源: https://codeday.me/bug/20191109/2010920.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有