2013-03-20 62 views
2

Hy guys!我在Predis做了樂觀的鎖定。問題在於,Redis文檔說,當監視的密鑰被修改時,那麼執行返回一個'Null Multi-bulk reply'。 Predis的外觀如何? Sady我沒有找到Pedis的任何有用的文檔(不包括非常基本的教程)。Predis Null批量回復

這裏是我的代碼看起來像此刻:

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調用該函數。

回答

2

由Redis返回的空多個批量答覆僅由Predis翻譯爲NULL,因此當客戶端從EXEC而不是數組返回時,表示該事務已被服務器中止。在您的腳本中,您應該檢查是否$result === null(請注意嚴格比較)以安全地捕獲中止的事務。

可替代地,而不是直接使用MULTIEXEC等與Predis可以使用用於通過Predis\Client::multiExec()方法暴露交易的更高級抽象,以類似的方式,以它是如何在this example使用校驗和 - 設置和一個可選的自動重試計數,用於終止客戶端拋出異常之後的中止事務。

+0

感謝您的信息!我從現在開始使用multiExec()。 – 2013-03-21 11:50:02