加入收藏 | 设为首页 | 会员中心 | 我要投稿 91站长网 (https://www.91zhanzhang.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

redis cluster 集群模式下的布隆过滤器(php)

发布时间:2023-01-10 10:02:20 所属栏目:PHP教程 来源:网络
导读: redis cluster下的布隆过滤器(Bloom Filter)
在文章开始前,如果还没搭建集群环境的,可以参见 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地址:

下面进行一些连接集群的一些简单操作

<?php
require_once('./predis-1.1/autoload.php');
//这里的ip是master节点地址,不用全部写全,一个也可以
$cluster_arr = [
    'tcp://127.0.0.1:6380',
    'tcp://127.0.0.1:6381',
    'tcp://127.0.0.1:6382'
];
//这里实例化的对象,必须在数组指定为cluster模式
$redis = new Predis\Client($cluster_arr, array('cluster'=>'redis'));
$redis->set('duoduo2',222);
$redis->set('duoduo3',393);
$redis->set('duoduo4',444);

在测试完基本的操作之后,我们进行创建布隆过滤器,上方的phpredis的官方扩展对插件形式的布隆过滤器不太友好,而predis也没有提供原始的命令行模式( 单机模式下的phpredis操作原生命令的为 $client->rawCommand() )

在笔者在predis的github仓库提问时,一位外国网友回复了笔者,他是用redis中的setbit getbit 命令下去完成布隆过滤器的。在外国友人的帮助下,笔者使用这两者两种命令完成了布隆过滤器

<?php
require_once('./predis-1.1/autoload.php');
//这里的ip是master节点地址,不用全部写全,一个也可以
$cluster_arr = [
    'tcp://127.0.0.1:6380',
    'tcp://127.0.0.1:6381',
    'tcp://127.0.0.1:6382'
];
//这里实例化的对象,必须在数组指定为cluster模式
$redis = new Predis\Client($cluster_arr, array('cluster'=>'redis'));
//设置
$redis->setbit('dump',7,1);
$redis->setbit('dump',8,1);
$redis->setbit('dump',9,1);
//修改  value值只能为二进制 0 1
$redis->setbit('dump',7,0);
$redis->setbit('dump',8,0);
$redis->setbit('dump',9,0);
//获取
$res1 = $redis->getbit('dump',7);
$res2 = $redis->getbit('dump',8);
$res3 = $redis->getbit('dump',9);
echo PHP_EOL;
var_dump($res1);
echo PHP_EOL;
var_dump($res1);
echo PHP_EOL;
var_dump($res1);

为什么setbit命令可以完成布隆过滤器?

setbit 原理参见 redis的setbit这个bit怎么理解,这里就不赘述了。

从上面可以看到 setbit 原理是根据偏移量偏移n位,而布隆过滤器本质上就是一个 bit 向量或者说 bit 数组,本质上是一样的。

布隆过滤器的应用场景

利用布隆过滤器减少磁盘 IO 或者网络请求,因为一旦一个值必定不存在的话,我们可以不用进行后续昂贵的查询请求。

布隆过滤器的优点与缺点

优点:

布隆过滤器的存储空间和插入/查询时间都是常数。Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能。

缺点:

存在一定的误算率,随着存入的元素数量增加,误算率随之增加(常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣)一般情况下不能从布隆过滤器中删除元素,首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。这就导致删除元素需要很高的成本。

(编辑:91站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!