2

みんな!Predis で楽観的ロックを行っています。問題は、Redis のドキュメントに、監視対象のキーが変更されると、実行によって「Null Multi-bulk reply」が返されると記載されていることです。Predis ではどのように見えますか? 悲しいことに、Pedis に役立つドキュメントは見つかりませんでした (非常に基本的なチュートリアルは数えません)。

現時点で私のコードは次のようになります。

private function updateUrlMaxProcessingTime($time, $hoursSinceUnixEpoch) {
    //Save the key and the field. They can change anytime because of the timestamp.
    $key = $this->statisticsConfig->getKeyFromDataName(StatisticsEnum::URL_MAX_PROCESS_TIME, $hoursSinceUnixEpoch);
    $field = $this->statisticsConfig->getFieldFromDataName(StatisticsEnum::URL_MAX_PROCESS_TIME, $hoursSinceUnixEpoch);

    //Update the max url processing time if necessary.
    $this->redis->watch($key);

    $val = $this->redis->hget($key, $field);
    if ($val < $time) {
        $this->redis->multi();
        $this->redis->hset($key, $field, $time);
        $result = $this->redis->exec();

        //TODO: fix this
        if ($result != null && $result[0] != null && $result[0] != -1) {
            return true;
        } else {
            return false;
        }
    } else {
        $this->redis->unwatch();
        return true;
    }
}

戻り値が false である限り、関数を呼び出します。

4

1 に答える 1

2

Redis によって返された null マルチバルク応答はNULL、Predis によって単純に変換されるため、クライアントがEXEC配列ではなく配列からそれを返した場合、サーバーによってトランザクションが中止されたことを意味します。スクリプトでは、$result === null(厳密な比較に注意してください) 中止されたトランザクションを安全にキャッチするかどうかを確認する必要があります。

または、 PredisMULTIで , et alを直接使用する代わりに、メソッドEXECによって公開されたトランザクションに、より高レベルの抽象化を使用できますクライアントが例外をスローした後に中止されたトランザクションの数。Predis\Client::multiExec()

于 2013-03-20T19:18:25.903 に答える