2009年9月23日 星期三

[引用]memcache使用時的一些細節

來源:http://www.ooso.net/archives/428

  • 用memcache保存session的例子,非常簡單

    CODE:
    <?
    1. $session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port ";
    2. ini_set('session.save_handler', 'memcache');
    3. ini_set('session.save_path', $session_save_path);
      ?>

  • memcache每一個item上限是1M,注意不要超出上限
  • memcache本身並不支持namespace,但是可以通過一些手段模擬出namespace的效果來,見Memcache 中模擬 namespace
  • 剛接觸memcache的時候,可能會寫出這樣的代碼來

    CODE:
    1. $zhang = $memcache->get('key1');
    2. $li = $memcache->get('key2');
    3. $wang = $memcache->get('key3');

    這種寫法實際運行效果是

    • get(key1) - 客戶端發出請求 - 服務器端查詢 - 客戶端獲取
    • get(key2) - 客戶端 - 服務器端 - 客戶端
    • get(key3) - 客戶端 - 服務器端 - 客戶端
    • ...

    如此一來,會有三次客戶端和服務器端交互的過程。但是如果用批量查詢的方法,就只有一次交互的過程。比如:


    CODE:
    1. $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");

【下列文章您可能也有興趣】

沒有留言: