以下是我的代码目前的样子:
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,我就调用该函数。
答案 0 :(得分:2)
Redis返回的null多批量回复只是被Predis翻译为NULL
,所以当客户端从EXEC
而不是数组返回时,意味着事务已被中止服务器。在您的脚本中,您应该检查是否$result === null
(注意严格比较)以安全地捕获中止的事务。
或者,不是直接使用MULTI
,EXEC
等使用Predis,而是可以对Predis\Client::multiExec()
方法公开的事务使用更高级别的抽象,类似于它是如何在this example中使用check-and-set和可选的自动重试计数来中止事务,之后客户端抛出异常。