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 多批量回复被简单地转换为NULLPredis,因此当客户端从而EXEC不是数组返回它时,这意味着事务已被服务器中止。在您的脚本中,您应该只检查是否$result === null(注意严格比较)以安全地捕获中止的事务。

或者,您可以对方法公开的事务使用更高级别的抽象,而不是直接使用Predis ,其MULTI方式类似于本示例中使用检查和设置和可选的自动重试的方式计算客户端抛出异常后中止的事务。EXECPredis\Client::multiExec()

于 2013-03-20T19:18:25.903 回答