來源:http://www.ooso.net/archives/428
- 用memcache保存session的例子,非常簡單 CODE:<?
- $session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port ";
- ini_set('session.save_handler', 'memcache');
- ini_set('session.save_path', $session_save_path);
?>
-
- memcache每一個item上限是1M,注意不要超出上限
- memcache本身並不支持namespace,但是可以通過一些手段模擬出namespace的效果來,見Memcache 中模擬 namespace
- 剛接觸memcache的時候,可能會寫出這樣的代碼來 CODE:
- $zhang = $memcache->get('key1');
- $li = $memcache->get('key2');
- $wang = $memcache->get('key3');
這種寫法實際運行效果是
- get(key1) - 客戶端發出請求 - 服務器端查詢 - 客戶端獲取
- get(key2) - 客戶端 - 服務器端 - 客戶端
- get(key3) - 客戶端 - 服務器端 - 客戶端
- ...
如此一來,會有三次客戶端和服務器端交互的過程。但是如果用批量查詢的方法,就只有一次交互的過程。比如:
CODE:- $all = $memcache->get(array('key1', 'key2', 'key3'));
這樣性能會有一些提升。對於其它程序語言來說,也封裝了類似get_multi這樣的方法。
-
- 從數據庫從查詢獲得一個列表,放到memcache裡面保存起來是一個不錯的主意,但是不要忘記memcache有1m限制。 如果列表太大,可以考慮把數據分割開來,然後用key序列來保存這個列表數據,比如event_0_500來保存前500行,用event_0_1000 保存500-1000行,在獲取的時候可以用前面說的批量get來一次性得到這個列表。
- 經常觀察memcache的大小,以及命中率,方便調整緩存策略
//生成一個用來保存 namespace 的 key
$ns_key = $memcache->get("foo_namespace_key");
//如果 key 不存在,則創建
if($ns_key===false)
$memcache->set("foo_namespace_key", rand(1, 10000));
//根據 namespace_key 生成真正的 key
$my_key = "foo_".$ns_key."_12345";
//需要刪除整個 namespace 裡的對象的時候,這樣處理即可:
$memcache->increment("foo_namespace_key");
沒有留言:
張貼留言