0

redis-cluster にキーと値のペアを追加し、1 つのパイプラインで新しいキーの有効期限を設定しようとしています。キーが移動されたというエラーが発生するたびに、Predis はパイプライン処理なしのように MOVED ステートメントに従う必要があると思います。

パイプで失効呼び出しを行うことはできませんか? redis_version: 3.0.2 で Predis 1.0.2-dev を使用しています

これは機能します:

$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 ではパイプラインが機能しないようです。期限切れ呼び出しを削除し、パイプに set 呼び出しのみがあると、同じエラーが発生します。

4

1 に答える 1