Memcache的基礎知識

1、什麼是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沒有利用完,那麼也不會存放別的數據。

php

2、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() 函數進行設置,以添加緩存數據爲例:web

#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。
數據庫

3、Linux下安裝Memcache服務端和客戶端

Memcache的基礎知識
Memcache的基礎知識
Memcache的基礎知識
Memcache的基礎知識
Memcache的基礎知識
Memcache的基礎知識

4、PHP中使用Memcache

  系統類:addServer,addServers,getStats,getVersion
  數據類:add,set,delete,flush,replace,increment,get
  進階類:setMulti,deleteMulti,getMulti,getResultCode,getResultMessage緩存

<?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();
相關文章
相關標籤/搜索