zoukankan      html  css  js  c++  java
  • 布隆过滤器(BloomFilter)持久化

    摘要

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


    关于BloomFilter的基本原理、jar包及入门Demo,请参考我的博客:布隆过滤器

    数据持久化
    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);
    			}
    		}
    	}
    }
    
    读取持久化数据
    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);
    			}
    		}	
    	}
    }
    
    Demo说明
    Demo1:初始化filter对象,并导入测试数据,然后结合writeTo()方法将数据持久化到本地磁盘;
    Demo1:初始化filter对象,读取Demo1持久化到磁盘的数据,然后将数据导入到filter;
    测试验证:Demo1和Demo2都对创建后的filter进行了测试验证。
    
    更多参考

    基于Redis的Bloomfilter去重(附代码)

    布隆过滤器

    Guava学习笔记:Google Guava 类库简介

    google/guava

  • 相关阅读:
    如何在centos7中设置redis服务器开机自启动
    查看linux上面是否有安装redis,redis启动
    windows下用navicat远程链接虚拟机Linux下MySQL数据库
    MySql Host is blocked because of many connection errors 问题的解决方法
    swoft实现自动重启服务
    Centos7安装NPM
    微信公众号开发---上传临时素材到公众号遇到的问题:"errcode":41005,"errmsg":"media data missing
    Android SDK镜像更新网速慢的解决问题
    文件下载
    sql执行顺序
  • 原文地址:https://www.cnblogs.com/taro/p/8426941.html
Copyright © 2011-2022 走看看