隆过滤器(BloomFilter)持久化

Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式程序的统一去重。我们可以将数据进行持久化,这样就克服了down机的问题,常见的持久化方法包括持久化到本地磁盘或结合Redis进行持久化。本文主要介绍持久化到本地的操作。

pom.xml

<dependencies>    
        <dependency>    
            <groupId>com.google.guava</groupId>    
            <artifactId>guava</artifactId>    
            <version>22.0</version>    
        </dependency>    
</dependencies>

1、数据持久化:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class Demo1 {
    
    public static void main(String[] args) throws FileNotFoundException {
        
        BloomFilter<Integer> filter = BloomFilter.create(
                  Funnels.integerFunnel(),
                  500,
                  0.01);
        
        //导入数据到filter
        for(int i = 0; i < 100; i++ )
        {
            filter.put(i);
        }
        
        //数据持久化到本地
        File f= new File("d:" + File.separator + "test2"); 
        OutputStream out = null;
        out = new FileOutputStream(f);    
        
        try {
            filter.writeTo(out);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //测试验证
        for(int i = 0 ; i < 10; i++)
        {
            boolean result = filter.mightContain(i);
            
            if(result)
            {
                System.out.println("i = " + i + " " + result);
            }
        }
    }
}

2、读取持久化:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class Demo2 {

    public static void main(String[] args) throws FileNotFoundException {
        
        BloomFilter<Integer> filter = BloomFilter.create(
                  Funnels.integerFunnel(),
                  500,
                  0.01);
        
        //将之前持久化的数据加载到Filter
        File f= new File("d:" + File.separator + "test2") ; 
        InputStream in = null;
        in = new FileInputStream(f); 
        try {
            filter = BloomFilter.readFrom(in,Funnels.integerFunnel());
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //测试验证
        for(int i = 0 ; i < 10; i++)
        {
            boolean result = filter.mightContain(i);
            
            if(result)
            {
                System.out.println("i = " + i + " " + result);
            }
        }   
    }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值