文件目录结构如下

1、composer predis
composer require predis/predis
2、cluster.php
require "vendor/autoload.php";
$parameters = [
'139.159.141.107:6381',
'139.159.141.107:6382',
'139.159.141.107:6383',
'139.159.141.107:6384'
];
$options = [
'cluster' => 'redis',
'parameters' => [
'password' => "binleen",
]
];
$client = new Predis\Client($parameters, $options);
$parameters = $parameters[array_rand($parameters)];
$connectionInfo = explode(':',$parameters);
//得到槽节点信息,保存在某个缓存文件当中
$slotInfo = $client->getClientFor($parameters)->executeRaw(['cluster','slots']);//获取结果如下图1
$slotNodes = [];
/* 槽范围 节点ip :节点端口号
* [1,1000]=>139.159.141.107:6381
*
* */
foreach($slotInfo as $slot){
$slotNodes[$slot[0].",".$slot[1]] = $slot[2][0].":".$slot[2][1];
}
//var_dump($slotNodes);//获取结果如下图二
//执行批量删除操作
$delKeys = ["test1","test2","name","age","score"];
//2.得到key跟节点的对应关系
$crc = new \Predis\Cluster\Hash\CRC16();
/*
* 使用管道发送命令,可以节约一点网络资源
* ['139.159.141.107:6381']=>'name1,name2'
* ['139.159.141.107:6382']=>'name4,name5'
* ['139.159.141.107:6383']=>'name3'
*
* */
$delNodes = [];
foreach($delKeys as $keyName){
$code = $crc->hash($keyName) % 16384; //计算出某个key对应的槽节点
//循环匹配,如果key在某个节点的范围之内就拼接数据(有可能多个key在同一节点) key:ip+端口 $val:节点范围
array_walk($slotNodes,function($key,$val) use ($code,&$delNodes,$keyName){
$slots = explode(",",$val);
if($code >= $slots[0] && $code <= $slots[1]){
$delNodes[$key][] = $keyName;
}
});
}
// var_dump($delNodes);//结果显示如下图三
//执行命令并且返回结果
foreach ($delNodes as $key=>$nodes){
$info = $client->getClientFor($key)->pipeline(function($pipe) use ($nodes){
foreach($nodes as $val){
$pipe->del($val);
}
});
}



本文介绍如何使用Predis库在PHP中操作Redis集群,包括安装配置、连接集群、获取槽节点信息及执行批量删除操作。通过示例代码展示了如何计算key与节点的对应关系,并使用管道发送命令来提高效率。
2034

被折叠的 条评论
为什么被折叠?



