Categories
Copy_N_Paste Programming/php

解決 memcache race condition 的問題

解決辦法就是避免所有的 query 集中在那個 expire 時間點上 , 那該 user 的方法是每次的 get 時加上一個亂數的時間差 .

http://www.alexhopmann.com/2008/06/13/memcache-race-condition-fun/

memcache 的作者認為, user “不應該” 關心他的資料為什麼不再 memcache 裡 , 就算是 memcache server 都關掉, 都不能影響程式的進行, 頂多程式變慢而已.

[code language=’php’]
$key=’key’;
$obj = $memcache->get($key);
if ( $obj==NULL ) {
$obj = Get_obj_from_table();
$memcache->set($key, $obj, $expire);
}
[/code]

測試心得是:

  • 如果 memcached server 的 memory 滿了, 他的 bytes / curr_items 就不會再增加了 , 但是 client 還是可以 set key / get key 沒問題
  • 如果關掉某些 memcache server , 所有的 set 動作 “會” 再重新分配到其他活的 server 上, 要注意 memcache server 群的容量問題, 在 expire 時間內還是可以抓到資料, 不過還是有隨機的 set 是 fail 的(不多啦!)
  • 如果 add的一堆 server 都掛了 , 那麼會 hang 在 set/get 上面 , 等 tcp timeout

這邊有 使用 memcache 最一般寫法的 pattern

擷取-memcache-race-condition