一分钟学会系列:Guava布隆过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/t1g2q3/article/details/87704249
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.nio.charset.Charset;

/**
 * 布隆过滤器
 *
 * bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。
 * 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。
 *
 *
 * 优点:不需要存储key,节省空间
 * 缺点:
 * 1. 算法判断key在集合中时,有一定的概率key其实不在集合中
 * 2. 无法删除
 *
典型的应用场景:
1.某些存储系统的设计中,会存在空查询缺陷:当查询一个不存在的key时,需要访问慢设备,导致效率低下。比如一个前端页面的缓存系统,可能这样设计:先查询某个页面在本地是否存在,如果存在就直接返回,如果不存在,就从后端获取。但是当频繁从缓存系统查询一个页面时,缓存系统将会频繁请求后端,把压力导入后端。这时只要增加一个bloom算法的服务,后端插入一个key时,在这个服务中设置一次需要查询后端时,先判断key在后端是否存在,这样就能避免后端的压力。
2.如何判断元素在亿级数据中存在
现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。
 * 
 * @author  tangguoqiang
 */
public class TestBloomFilter {

    public static void main(String[] args) {
        BloomFilter bloomFilter = BloomFilter.create(
                Funnels.stringFunnel(Charset.defaultCharset()),
                1000000,0.001);
        bloomFilter.put("Test");
        bloomFilter.put("Go");
        bloomFilter.put("Java");
        bloomFilter.put("Python");
        bloomFilter.put("C++");
        bloomFilter.put("Array");
        bloomFilter.put("Lambda");
        System.out.println(bloomFilter.mightContain("TangGuoqiang"));
        System.out.println(bloomFilter.mightContain("Java"));
    }
}

猜你喜欢

转载自blog.csdn.net/t1g2q3/article/details/87704249
今日推荐