Массовый ответ Predis Null

Привет ребята! Делаю оптимистическую блокировку в Predis. Проблема в том, что в документации Redis говорится, что при изменении отслеживаемого ключа выполнение возвращает «Нулевой групповой ответ». Как это выглядит в 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.


person Lakatos Gyula    schedule 20.03.2013    source источник


Ответы (1)


Массовый ответ null, возвращаемый Redis, просто переводится Predis как NULL, поэтому, когда клиент возвращает это из EXEC вместо массива, это означает, что транзакция была прервана сервером. В вашем скрипте вы должны просто проверить, $result === null (обратите внимание на строгое сравнение), чтобы безопасно перехватывать прерванные транзакции.

В качестве альтернативы, вместо прямого использования MULTI, EXEC и др. с Predis, вы можете использовать более высокоуровневую абстракцию для транзакций, предоставляемых методом Predis\Client::multiExec(), аналогично тому, как он используется в этот пример с проверкой и установкой и необязательным автоматическим подсчетом повторных попыток для прерванных транзакций, после которых клиент выдает исключение.

person nrk    schedule 20.03.2013
comment
Спасибо за информацию! С этого момента я использую multiExec(). - person Lakatos Gyula; 21.03.2013