Predis Null批量回复

时间:2013-03-20 13:25:54

标签: php redis watch reply predis

嗨伙计们!我在Predis中做了一个乐观的锁定。问题是Redis文档说当被监视的密钥被修改时,execute会返回一个'Null Multi-bulk reply'。在Predis中看起来如何? Sady我没有为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,我就调用该函数。

1 个答案:

答案 0 :(得分:2)

Redis返回的null多批量回复只是被Predis翻译为NULL,所以当客户端从EXEC而不是数组返回时,意味着事务已被中止服务器。在您的脚本中,您应该检查是否$result === null(注意严格比较)以安全地捕获中止的事务。

或者,不是直接使用MULTIEXEC等使用Predis,而是可以对Predis\Client::multiExec()方法公开的事务使用更高级别的抽象,类似于它是如何在this example中使用check-and-set和可选的自动重试计数来中止事务,之后客户端抛出异常。