Bloom在1970年提出了Bloom Filter。它实际上是一个长二进制向量,并且一系列随机映射功能。Buron滤波器可用于检索元素是否在集合中。它的优势在于空间效率和查询时间非常多。比普通算法更好。缺点是存在一定的误解率和难度删除。
上面的简介描述了什么是Bloom过滤器的更全面的描述。如果不充分理解,您可以将Bloom过滤器理解为一组集。我们可以将元素添加到添加和通过包含包含的元素中的元素,以containswhether包含某个元素。因为本文告诉Bloom过滤器将与Redis结合使用,REDIS中的数据结构的类型将得到更好的理解,可以更好地理解REDIS中的数据结构的类型Redis中Bloom过滤器中使用的说明与一组集(跟随-up)Essence非常相似
在学习Bloom过滤器之前,有必要谈论它的优势和缺点,因为我们想要好东西!
Buron过滤器的优势:
Buron过滤器的缺点:
Bloom过滤器可以告诉我们“某事一定不存在或可能存在”,也就是说,Bloom过滤器说数字不存在,并且Bloom Filter表示可能存在存在(错误判断的错误判断),随后将说),您可以通过这种判断的特征来做很多有趣的事情。
Bloom过滤器实际上是一个长的二进制向量和一系列随机映射功能。将Bloom滤波器插入Redis中,例如,Redis中Bloom滤波器的底层是一个大尺度阵列(二进制阵列)+多个无偏见的哈希功能。
一个大型阵列(二进制阵列):
多态的哈希函数:
无偏的哈希函数是一个相对均匀的哈希函数,可以计算元素的哈希值,它可以使计算的元素能够在数组中竞标更均匀的映射位置。
以下是一个简单的布鲁姆滤波器图。K1和K2代表增加的元素。A,B和C是无偏的哈希函数,底层是二进制数组。
在Bloom滤波器增加元素之前,需要需要绽放过滤器的空间来初始化上述二进制数组。此外,还需要计算公正的哈希功能的数量。Bloom滤波器提供了两个参数,这是元素的大小,预期会添加元素和错误率F。Bloom滤波器中的算法计算大小。基于这两个参数的二进制数组的l和无偏的哈希函数的数字k。
它们之间的关系相对简单:
以下地址是一个免费的在线Bloom过滤器在线计算:
https://krisives.github.io/bloom-calculator/
为了将元素添加到Bloom滤波器中,需要根据k -unbiased哈希函数来计算添加的密钥,然后使用数组的长度来获取数组的位置。1
例如,key = liziba,无偏的哈希函数的数字k = 3分别为hash1,hash2和hash3。计算出三个哈希函数后,获得了三个阵列,并将其值的值修改为修改为1. 1。
如图所示:
Bloom过滤器的最大用途是判断不存在或可能存在某物,这是查询元素的结果。其查询元素的过程如下:
关于错误判断,这很容易理解。哈希函数的良好性和不能完全避免哈希冲突,也就是说,可以通过多个元素计算的哈希值可能是相同的。阵列索引是相同的,这是误判的原因。例如,在李Zizhen和李Ziyi的哈希值之后获得的阵列索引都是1,但实际上,这里只有li Ziyi。如果李Ziyi目前还不在这里,那将通过错误判断!因此,只要判断元素的存在的原则,Bloom过滤器的最大缺点就很容易理解!
没有任何
Bloom过滤器不支持元素的删除。目前,有一些特定变形的BLOOM过滤器来支持删除元素!关于为什么删除并不是很容易理解。哈希冲突必须存在,删除必须非常痛苦!
v1.1.1
https://github.com/redislabsmodules/rebloom/archive/v1.1.1.1.tar.gz
v2.2.6
https://github.com/redislabsmodules/rebloom/archive/v2.2.6.tar.gz
以下安装在指定目录中完成。您可以为软件安装和管理选择合适的统一目录。
4.2.1下载插件 - 插件压缩软件包4.2.2脱脱拆插4.2.3 compile插头-in
汇编成功后,您可以看到redisbloom.so文件。
4.3.1 redis配置文件修改了redis.conf配置文件中LOADMODULE的配置项。我们可以在此处直接修改它,对于后续修改将更方便。
保存出口后,请记住重新启动Redis!
保存出口后,请记住重新启动Redis!
保存出口后,请记住重新启动Redis!
4.3.2测试是否成功测试了Redis集成Bloom过滤器的主要指令,如下所示:
连接客户进行测试,如果指令有效,则证明集成成功
如果以下情况(错误)可以通过以下方式检查未知命令:
bf.add表示添加一个元素,并且添加成功返回1
BF.MADD意味着添加多个元素
bf.exists指示是否确定元素是否存在,存在返回1,无返回0
BF.MEXISTS意味着判断是否存在多个元素,返回1,无返回0
有很多使用Bloom过滤器的方法,并且有许多大老板。我在此处使用Google Guava袋中实现的Bloom过滤器。这种Bloom过滤器方法是在本地内存中实现的。
它被错误判断的100075次,这可能是预期的0.01(1000万),非常接近我们设置的FPP = 0.01。
在Guava软件包中的BloomFilter源代码中,有四个参数构建一个BloomFilter对象:
为了总结这三个测试,得出以下结论:
经常问Redis有关缓存故障。更好的解决方案是使用Bloom过滤器。它也通过一个空的对象来解决,但最好的方法肯定是Bloom过滤器。我们可以使用Bloom FilterDetermine是否存在元素,并避免从缓存和数据库中的数据进行查询访问!只要以下代码仅需要通过BloomFilter.Contains.Contains.Contains(XXX),我在这里犯罪率!