布隆过滤器究竟是什么,这一篇给讲的明明白白的( 三 )

最后得出的结果

布隆过滤器究竟是什么,这一篇给讲的明明白白的

文章插图
 
我们看到这个结果正是印证了上面的结论,这100个真实存在元素在布隆过滤器中一定存在,另外9900个不存在的元素,布隆过滤器还是判断了216个存在,这个就是误判,原因上面也说过了,所以布隆过滤器不是万能的,但是它能帮我们抵挡掉大部分不存在的数据已经很不错了,已经减轻数据库很多压力了,另外误判率0.02是在初始化布隆过滤器的时候我们自己设的,如果不设默认是0.03,我们自己设的时候千万不能设0!
Redis实现布隆过滤器上面使用guava实现布隆过滤器是把数据放在本地内存中,我们项目往往是分布式的,我们还可以把数据放在redis中,用redis来实现布隆过滤器,这就需要我们自己设计映射函数,自己度量二进制向量的长度,下面贴代码,大家可以直接拿来用的,已经经过测试了 。。
/** * 布隆过滤器核心类 * * @param <T> * @author jack xu */public class BloomFilterHelper<T> {    private int numHashFunctions;    private int bitSize;    private Funnel<T> funnel;    public BloomFilterHelper(int expectedInsertions) {        this.funnel = (Funnel<T>) Funnels.stringFunnel(Charset.defaultCharset());        bitSize = optimalNumOfBits(expectedInsertions, 0.03);        numHashFunctions = optimalNumOfHashFunctions(expectedInsertions, bitSize);    }    public BloomFilterHelper(Funnel<T> funnel, int expectedInsertions, double fpp) {        this.funnel = funnel;        bitSize = optimalNumOfBits(expectedInsertions, fpp);        numHashFunctions = optimalNumOfHashFunctions(expectedInsertions, bitSize);    }    public int[] murmurHashOffset(T value) {        int[] offset = new int[numHashFunctions];        long hash64 = Hashing.murmur3_128().hashObject(value, funnel).asLong();        int hash1 = (int) hash64;        int hash2 = (int) (hash64 >>> 32);        for (int i = 1; i <= numHashFunctions; i++) {            int nextHash = hash1 + i * hash2;            if (nextHash < 0) {                nextHash = ~nextHash;            }            offset[i - 1] = nextHash % bitSize;        }        return offset;    }    /**     * 计算bit数组长度     */    private int optimalNumOfBits(long n, double p) {        if (p == 0) {            p = Double.MIN_VALUE;        }        return (int) (-n * Math.log(p) / (Math.log(2) * Math.log(2)));    }    /**     * 计算hash方法执行次数     */    private int optimalNumOfHashFunctions(long n, long m) {        return Math.max(1, (int) Math.round((double) m / n * Math.log(2)));    }}这里在操作redis的位图bitmap,你可能只知道redis五种数据类型,string,list,hash,set,zset,没听过bitmap,但是不要紧,你可以说他是一种新的数据类型,也可以说不是,因为他的本质还是string,后面我也会专门写一篇文章来介绍数据类型以及在他们在互联网中的使用场景 。。


推荐阅读