memcache是一套分佈式高速緩存數據庫系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調到內存中,而後從內存中讀取,從而大大提升讀取速度,目前被許多網站使用以提高網站的訪問速度。Memcache官方網站:http://memcached.org
Memcache使用場景:
1.非持久化存儲:對數據存儲要求不高
2.分佈式存儲:不適合單機使用
3.Key/Vaulue存儲:格式簡單,不支持List,Array數據格式
特徵和限制:
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
先來解釋下標題中三種寫法:首字母大寫的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
上面明確的提出,當使用長連接的時候。。。。。所以 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。
數據庫
系統類: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();