最后得出的结果
文章插图
我们看到这个结果正是印证了上面的结论,这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,后面我也会专门写一篇文章来介绍数据类型以及在他们在互联网中的使用场景 。。
推荐阅读
- 老虎究竟有几种类型?
- 太岁究竟是什么“东西”?我国科学家用精密仪器检测揭示太岁之谜
- 普洱茶选购标准,选购普洱茶生茶的绝招
- 牡丹花茶原料制作以及成分究竟是怎样的,玫瑰花茶到底是什么茶
- 变速箱的功能究竟是什么,汽车不要变速箱行不行?
- 汽车尾气排放究竟跟雾霾有多大关系
- 比亚迪的独门秘籍?DM-i超级混动技术究竟是什么?
- 阳历和阴历究竟有啥不同? 农历是阳历还是阴历
- 微信公众号阅读数分析的技巧是什么? 看看究竟该怎么做
- 铁观音究竟是属黄茶,黄茶白茶绿茶区别是什么