天天看點

Memcache的基礎知識

一、什麼是Memcache

  memcache是一套分布式高速緩存資料庫系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來存儲各種格式的資料,包括圖像、視訊、檔案以及資料庫檢索的結果等。簡單的說就是将資料調到記憶體中,然後從記憶體中讀取,進而大大提高讀取速度,目前被許多網站使用以提升網站的通路速度。Memcache官方網站:http://memcached.org

  Memcache使用場景:

   1.非持久化存儲:對資料存儲要求不高

   2.分布式存儲:不适合單機使用

   3.Key/Vaulue存儲:格式簡單,不支援List,Array資料格式

Memcache的基礎知識

  特征和限制:

   1.在Memcached中可以保持的item資料量是沒有限制的,隻要記憶體足夠。

   2.Memcached單程序在32位系統中最大使用記憶體為2G,若在64位系統則沒有限制,這是由于32位系統限制但程序最多可使用2G記憶體,要使用更多記憶體,可以分多個端口開啟多個Memcached程序。

   3.最大30天的資料過期時間,設定為永久的也會在這個時間過期,常量REALTIME_MAXDELTA 606024*30 控制

   4.最大鍵長為250位元組,大于該長度無法存儲,常量KEY_MAX_LENGTH控制

   5.單個item最大資料是1MB,超過1MB資料不予存儲,常量POWER_BLOCK 1048576 進行控制,它是預設的slab大小

   6.最大同時連接配接數是200,通過 conn_init() 中的 freetotal 進行控制,最大軟連接配接數是1024,通過 settings.maxconns=1024 進行控制

   7.跟空間占用相關的參數: settings.factor = 1.25 , settings.chunk_size = 48,影響slab的資料占用和步進方式

   memcached是一種無阻塞的socket通信方式服務,基于libevent庫,由于無阻塞,對記憶體讀寫速度非常之快。

   memcached分伺服器端和用戶端,可以配置多個伺服器端和用戶端,應用于分布式的服務非常廣泛。

   memcached作為小規模的資料分布式平台是十分有效果的。

   memcached是鍵值一一對應,key預設最大不能超過128個位元組,value預設大小是1M,也就是一個slabs,如果要存2M的值(連續的),不能用兩個slabs,因為兩個slabs不是連續的,無法在記憶體中存儲,故需要修改slabs的大小,多個key和value進行存儲時,即使這個slabs沒有利用完,那麼也不會存放别的資料。

二、Mecached和memcache和memcached的差別

先來解釋下标題中三種寫法:首字母大寫的Mecached,指的是Memcached伺服器,就是獨立運作Memcached的背景伺服器,用作存儲緩存資料的“容器”。Memcached是可以獨立在web伺服器之外任何伺服器,甚至可以是叢集。memcached和memcache是Memcached的用戶端,通過二者通路Memcached伺服器,向容器存取資料。二者用途一緻,但在用法上稍有差異。如下:           

  1.memcache最早是在2004年2月開發的,最後更新是在2013年4月,而memcached 最早是在2009年1月開發的,最後更多是在2014年1月更新的。是以 memcache的曆史比 memcached 早。更多資訊可以參考:

  memcache : http://pecl.php.net/package/memcache

  memcached : http://pecl.php.net/package/memcached

  2.memcache是一個原生版本,完全是在 PHP 架構内開發的,支援 OO(面向對象)和非 OO 兩套接口并存,而memcahed是建立 libmemcached 的基礎上的,隻支援 OO 接口。這就意味着在 memcache 擴充的時候不要求安裝其他的東西,但是在安裝 memcached 的時候會要求你安裝 libmemcached。因為 libmemcached 是 memcache 的 C 用戶端,它具有低記憶體,線程安全等優點。據說新浪微網誌之前就全面将PHP的 memcache 替換成 PHP 的memcached,在高并發下,穩定性果斷提高。

  3.memcached 有個比較 nice 的地方,就是 flag 不是在操作的時候設定的,而是有一個統一的 setOption() 函數進行設定,以添加緩存資料為例:

#memcache:
bool   Memcache::add   (string  $key,mixed  $var  [, int  $flag  [,int  $expire]])

#memcached:
public  bool  Memcached::add(string   $key ,mixed  $value  [, int    $expiration])           

從上面各自的 add 方法可以看到,memcache 的 add 方法中的第三個參數代表是否對資料進行壓縮,這樣假如說我的緩存需要設定過期時間,但是 flag 參數在前面,我就得每一次都對 flag 進行設定!而 memcached 中使用 setOption() 來進行統一設定的(預設開啟壓縮)。

  4.memcached 比 memcache 支援更多的 memcache 協定,大概也就是說 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函數非常有用,但是 memcache 并不支援。更多的方法可以看 PHP 的官方手冊: memcache:http://php.net/manual/zh/book.memcache.php

memcached:http://php.net/manual/zh/book.memcached.php

  5.差别比較大的一點是,memcached支援 Binary Protocol,而 memcache 不支援,這意味着 memcached 會有更高的性能。但是很多說 memcached 不支援長連接配接,這其實不然,大家看官方手冊:http://php.net/manual/zh/memcached.construct.php

  

Memcache的基礎知識

  上面明确的提出,當使用長連結的時候。。。。。是以 memcached 是能夠實作長連接配接。

  6.兩者在實作某些相同功能所使用的算法也是有一個差異的,例如大家都知道“一緻性hash算法”是當添加或删除存儲節點時,對存儲在memcached上的資料影響較小的一種算法,在PHP的兩個擴充庫中,都可以使用該算法,但設定方法有所不同。

memcache
    修改php.ini添加:
    [Memcache]
    Memcache.allow_failover = 1
    ......
    ......
    Memcache.hash_strategy = consistent
    Memcache.hash_function = crc32
    ......
    ......
    或在PHP中使用 ini_set 方法
    Ini_set('memcache.hash_strteagy ','standrad');
    Ini_set('memcache.hash_function','crc32');

    memcached
    $mem = new memcached();
    $men->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
    $mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);           

總結三者關系描述:Memcahed 就比如是一個水庫(容器),memcache 是一個塑膠管,memcached 是一個 PVC 管。我們可以通過塑膠管或者 PVC 管為水庫上水或者取水,用哪種方式因人而異,而 PVC 管在輸送水的效率上明顯比塑膠管快,而且可以裝閥門、開口做分支等等,比塑膠管的花樣多。從上面的分析也可以得出一個結論:memcached 比 memcache 好,是以在以後的開發過程中,盡量使用memcached。

三、Linux下安裝Memcache服務端和用戶端

四、PHP中使用Memcache

<?php
$m = new  Memcache();
$array  =  array(
                            array('127.0.0.1',11211),
                            array('127.0.0.2',11211),
                );
$m->addServers($array);        //連接配接服務端
print_r($m->getStats());           //檢視狀态
print_r($m->getVersion());       //檢視版本号
//兩個add,後面一個不會覆寫掉前面一個
$m->add('mkey','mvalue',600);
$m->add('mkey','mvalue2',600);
echo $m->get('mkey');
//replace覆寫前面相同的key
$m->replace('mkey','mvalue2',600);
//set方法既可以直接覆寫也會替換覆寫
$m->set('mkey','mvalue',600);
//删除
$m->delete('mkey');
//清空全部緩存
$m->flush();
//每次加5和減5操作
$m->increment('num',5);
echo  $m->get('num');
$m->decrement('num',5);
//setMulti第一個參數是存儲的資料,第二個是過期時間
$data1 = array(
                'key'      =>       'value',
                'key2'    =>       'value2',
);
$m->setMulti($data,0);
$result = $m->getMulti(array('key','key2'));
print_r($result);
//一次性删除多條資料
$m->deleteMulti(array('key','key2'));
print_r($result);
//錯誤編碼與錯誤内容,官方參考文檔:https://www.php.net/manual/zh/memcached.getresultcode.php
echo  $m->getResultCode();
echo  $m->getResultMessage();