redis cluster 集群模式下的布隆过滤器(php)
在文章开始前,如果还没搭建集群环境的,可以参见 redis cluster搭建
什么是布隆过滤器
而布隆过滤器本质上是一个数据,采用的结构是比特数组
redis cluster下的布隆过滤器(Bloom Filter) 在文章开始前,如果还没搭建集群环境的,可以参见 redis cluster搭建 什么是布隆过滤器 而布隆过滤器本质上是一个数据,采用的结构是比特数组,可以根据下标迅速找到下标。相对于其他数据结构,布隆过滤器可以更高效的插入与查询,并且占用空间小。但也有缺点,由于是概率算法,精度会有所丢失,但如果参数设置的合理,可以将精准度控制的相对精确。 简单来说,布隆过滤器是一种概率算法,它说某条数据不存在时不一定会真的存在,但如果说某条数据不存在时,则一定不存在! 操作Redis中的布隆过滤器的两种方式 phpredis: Redis4.0版本后提供了插件功能,Redis官方提供的布隆过滤器正式登场。但这里的插件,在集群模式下,对Php支持不太友好,特别是最新版的php7.4和redis6.0的扩展使用RedisCluster类后PHP过滤器,每操作三到四个key时会有超时的现象,笔者看了看github中的留言,得知不是个别现象。。。 predis: 而笔者又在github中找到了前几年还在维护 predis 目前为止,这个版本是可用的,就是处于不维护的状态,最后一次更新在17年。。。 使用predis连接集群 讲完上面两种方式,我们采用的是最后predis 这里提供github地址: 下面进行一些连接集群的一些简单操作
在测试完基本的操作之后,我们进行创建布隆过滤器,上方的phpredis的官方扩展对插件形式的布隆过滤器不太友好,而predis也没有提供原始的命令行模式( 单机模式下的phpredis操作原生命令的为 $client->rawCommand() ) 在笔者在predis的github仓库提问时,一位外国网友回复了笔者,他是用redis中的setbit getbit 命令下去完成布隆过滤器的。在外国友人的帮助下,笔者使用这两者两种命令完成了布隆过滤器
为什么setbit命令可以完成布隆过滤器? setbit 原理参见 redis的setbit这个bit怎么理解,这里就不赘述了。 从上面可以看到 setbit 原理是根据偏移量偏移n位,而布隆过滤器本质上就是一个 bit 向量或者说 bit 数组,本质上是一样的。 布隆过滤器的应用场景 利用布隆过滤器减少磁盘 IO 或者网络请求,因为一旦一个值必定不存在的话,我们可以不用进行后续昂贵的查询请求。 布隆过滤器的优点与缺点 优点: 布隆过滤器的存储空间和插入/查询时间都是常数。Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能。 缺点: 存在一定的误算率,随着存入的元素数量增加,误算率随之增加(常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣)一般情况下不能从布隆过滤器中删除元素,首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。这就导致删除元素需要很高的成本。 (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |