2012-02-02 49 views
4

我在我的php網站上遇到memcache的問題。偶爾我會得到一個報告,說該網站行爲不當,當我看着memcache時,發現集羣中兩臺服務器上都存在幾個密鑰。兩個條目之間的數據不一樣(其中一個較舊)。memcached中的重複鍵

我對memcached的理解是,這不應該發生......客戶端應該散列密鑰,然後總是選擇相同的服務器。所以無論我的理解是錯誤的還是我的代碼是。任何人都可以解釋爲什麼這可能會發生?

FWIW服務器託管在Amazon EC2上。

我所有的內存緩存來連接都是通過這個函數打開:

$mem_servers = array(
    array('ec2-000-000-000-20.compute-1.amazonaws.com', 11211, 50), 
    array('ec2-000-000-000-21.compute-1.amazonaws.com', 11211, 50) 
); 

function ConnectMemcache() 
{ 
    global $mem_servers; 
    if ($memcon == 0) { 
      $memcon = new Memcache(); 
      foreach($mem_servers as $server) $memcon->addServer($server[0], $server[1], true); 
    } 
    return($memcon); 
} 

和值存儲通過此:

function SetData($key,$data) 
{ 
    global $mem_global_key; 
    if(MEMCACHE_ON_OFF) 
    { 
     $key = $mem_global_key.$key; 
     $memcache = ConnectMemcache(); 
     $memcache->set($key, $data); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

回答

1

我覺得你有上的問題,這個博客帖子觸動。

http://www.caiapps.com/duplicate-key-problem-in-memcache-php/

從它聽起來就像發生以下情況的文章:
- 關鍵是重建第二個服務器上更新的數據
- - 具有關鍵原先下降了
一個內存緩存服務器1服務器將恢復在線並與舊數據一起進入羣集。
- 現在你有鑰匙上的2個服務器保存不同的數據

聽起來像是你可能需要使用的Memcache ::沖洗,以清除內存緩存集羣的寫入前,以幫助減少重複多久可能在你的存在簇。