2013-07-30 193 views
3

在使用redis之前,我想檢查它的可用性,如果redis不可用,我將使用mysql,如果redis可用,我將使用它。如果我使用predis客戶端,我該怎麼做?Redis可用性檢查

我的第一個方法是:

/** 
    * @return bool 
    */ 
    public function check(){ 
     if([email protected] ($server['host'], $server['port'], $errno, $errstr, 3)){ 
      Debug::instance()->log('Redis connect error host: ' . $server['host'] . ' port: ' . $server['port']); 
      return false; 
     } 

     return true; 
    } 

但它是非常糟糕的主意,因爲我佔據免費插槽。現在我試着找到一個更好的方法。

+0

而如果MySQL也不算什麼可用?你的方法被破壞了:如果用戶/管理員給你的代碼配置了Redis的配置,假設它在那裏並且應該被使用。如果沒有,處理它,例如通過失敗並抱怨錯誤的配置。 – Sven

+0

你的問題是什麼?你嘗試過的更好的方法是什麼? – hakre

+0

我很抱歉有問題的錯誤。現在我試着找到一個更好的方法。Mysql總是可用的,但如果請求太多,redis將會遇到所有問題,並且在那一刻,我想將一部分請求移動到mysql。所以我試着知道可以redis處理請求或不。 – aieven

回答

1

使用predis客戶端和PING命令。

  • 如果收到PONG作爲響應,則返回true。
  • CommunicationException上返回false。
2

Redis可以處理比MySQL更多的請求,這就是爲什麼它經常用作緩存的原因。在筆記本電腦級別的硬件上,我看到它每秒處理超過1M個請求 - 單一實例沒有特殊的服務器端調整。

首先嚐試從redis獲取數據。如果連接失敗,請轉至MySQL。如果返回null,則轉到MySQL並將數據添加到Redis(可根據您的條件選擇超時),然後將數據返回給客戶端。

請不要在每個命令前執行ping操作。如果您擁有有效的連接,請嘗試獲取數據並處理無關內容。獲得空值意味着沒有數據可以提取。在每個命令之前執行ping操作都很浪費。每次打電話都要往返一次。通常,獲取數據的命令幾乎與ping一樣快,特別是考慮到測試乒乓球的成本。當考慮到你會進行測試,看看你是否有數據返回,每個命令模型之前的ping是不明智的。

在您的長期過程中打開您的連接,或者打開連接,每次查詢,然後關閉。我更喜歡前者,但意識到這並不總是可能的,這取決於您使用的框架。

作爲擁有數以百計的MySQL服務器並擁有數千個數據庫的基礎架構的人,不會總是假設MySQL在那裏,就像你不應該假定Redis總是在那裏一樣。崩潰發生,網絡發生,服務器絆倒或錯誤地反彈。

但是你可以按照「是TCP連接活着」和「然後給我數據」的流程,然後驗證你得到的數據。只要你考慮失敗的連接或超時請求,並處理它們,你就沒事。

至於如何實際使用predis代碼,我建議用文檔,如在the Predis github page

6

這應該做的伎倆被發現開始;)

// Redis configuration 
$vm = array(
    'host'  => '127.0.0.1', 
    'port'  => 6379, 
    'timeout' => 0.8 // (expressed in seconds) used to connect to a Redis server after which an exception is thrown. 
); 

$redis = new Predis\Client($vm); 
try { 
    $redis->ping(); 
} catch (Exception $e) { 
    // LOG that redis is down : $e->getMessage(); 
} 
if(isset($e)) { 
    //use MySQL 
} else { 
/* Use Redis */ 
}