redis - 将管道与 redis-cluster 一起使用时出现 Predis 错误

标签 redis cluster-computing pipeline predis

我尝试在我的 redis-cluster 中添加一个键值对,并在一个管道中为新键设置过期。每次我收到 key 被移动的错误时,但我认为 Predis 应该像没有流水线一样遵循 MOVED 语句。

难道不能在管道中调用 expire-call 吗?我正在使用 Predis 1.0.2-dev 使用 redis_version: 3.0.2

这个有效:

$parameters = ['tcp://10.9.200.51:47801', 'tcp://10.9.200.52:47801', 'tcp://10.9.200.53:47801', 'tcp://10.9.200.54:47801'];
$options    = ['cluster' => 'redis'];

$redis = new Predis\Client($parameters, $options);

for($i = 0; $i < 10; $i++)
{
    $rand = mt_rand(1111111,9999999);
    $k = 'test_'.$rand;
    try{
        $redis->set($k, 1);
        $redis->expire($k, 10);
    }
    catch(Exception $ex)
    {
        print_r($ex);
    }
}

?>

这不起作用:

$parameters = ['tcp://10.9.200.51:47801', 'tcp://10.9.200.52:47801', 'tcp://10.9.200.53:47801', 'tcp://10.9.200.54:47801'];
$options    = ['cluster' => 'redis'];

$redis = new Predis\Client($parameters, $options);

$pipe = $redis->pipeline();

for($i = 0; $i < 10; $i++)
{
    $rand = mt_rand(1111111,9999999);
    $k = 'test_'.$rand;
    try{
        $pipe->set($k, 1);
        $pipe->expire($k, 10);
    }
    catch(Exception $ex)
    {
        print_r($ex);
    }
}

$pipe->execute();
?>

我收到此错误:

PHP Fatal error:  Uncaught exception 'Predis\Response\ServerException' with message 'MOVED 7276 10.9.200.61:47902' in /var/www/predis_test/Predis/Pipeline/Pipeline.php:105
Stack trace:
#0 /var/www/predis_test/Predis/Pipeline/Pipeline.php(149): Predis\Pipeline\Pipeline->exception(Object(Predis\Connection\Aggregate\RedisCluster), Object(Predis\Response\Error))
#1 /var/www/predis_test/Predis/Pipeline/Pipeline.php(168): Predis\Pipeline\Pipeline->executePipeline(Object(Predis\Connection\Aggregate\RedisCluster), Object(SplQueue))
#2 /var/www/predis_test/Predis/Pipeline/Pipeline.php(217): Predis\Pipeline\Pipeline->flushPipeline()
#3 /var/www/predis_test/lasttest.php(31): Predis\Pipeline\Pipeline->execute()
#4 {main}
  thrown in /var/www/predis_test/Predis/Pipeline/Pipeline.php on line 105

编辑: 流水线似乎不适用于 redis-cluster。当我删除 expire 调用并且管道中只有 set 调用时,我得到了同样的错误。

最佳答案

Predis 管道需要集群中相同 SLOT 中的键(用于集群支持自动分片),这使得客户端很难处理从 Redis 集群服务器接收到的移动消息。

更多细节请引用以下问题和讨论:

结论是:不要在redis集群下使用pipeline。

关于redis - 将管道与 redis-cluster 一起使用时出现 Predis 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561851/

相关文章:

ruby-on-rails-3 - 在不同的应用程序中使用 Heroku 和 Resque

node.js - hdel 里面的 hget block nodejs redis

java - 集群中 2 个节点之间的通信

运行 doRedis- 即使已导出对象也未找到

amazon-web-services - Azure DevOps 管道

python - 如何在python中的sklearn中获取不同管道中的特征名称

java - Redis 与 java

amazon-web-services - 在 terraform 中动态更改 aws_elasticache_replication_group 的配置

cloud - 应用级集群有哪些技术?

python - 如何在 scikit-learn 的管道内对转换参数进行网格搜索