一、服務端
之前理解錯誤了。服務端只有一個memcache,一般把服務端稱作memcached(帶d),是因為守護進程的名稱就是叫做memcached(一個這樣的執行程序文件)。
編寫的語言:c語言
官網為:http://memcached.org/
二、客戶端
很多人都面對兩個php的擴展大有疑惑,而且也記不住,只是知道memcached擴展更加高級嘛。
其實,我覺得,只要了解c語言的兩個庫的區別,就能知道了本質區別了。
既然要操作服務端,那么就要有客戶端來操作。memcache服務官方把操作協議開發出來了,只要你按照它的協議編寫的客戶端都能與它服務端通信操作數據。
memcached服務端,支持是tcp協議來操作。所以客戶端只要按照tcp協議,都能連接服務端操作數據。
目前有兩個著名的用c語言的庫實現了操作服務端:libmemcache、libmemcached(帶d)。先有libmemcache庫,后面才發展了libmemcached庫
libmemcached庫 可不是 libmemcache ,它們是兩個不同的客戶端庫,前者現在的開發比較活躍,后者已經有很長時間沒有更新了。
libMemcached庫的介紹如下:
http://www.libmemcached.org/libMemcached.html
原文一言就概括了:libMemcached is an open source C/C++ client library and tools for the memcached server (http://danga.com/memcached). It has been designed to be light on memory usage, thread safe, and provide full access to server side methods.
我是一個開源的客戶端庫或工具,用於操作memcached服務器。什么設計成小內存消耗、線程安全】完全訪問服務端的各種函數等等優勢啦。
ps:學過c語言的會非常了解,c語言核心部只是包含基本的語法,常見的i/0操作是標准封裝的。其他很多功能都通過庫的形式提供,你可以調用開源的庫來完成自己的功能。
這樣可以自己根據自己需要來擴充。如果全部包含在c語言核心部分里面,那么會讓c語言核心變得臃腫,有些人用不上那些庫,有些人用得上,眾口難調。臃腫了損失的是性能和靈活性(有些用戶想自己用自己的庫,你干嘛封裝到里面去增加體積)
三、各種語言封裝庫來操作memcache服務端
很多語言操作memcache服務端,都通過封裝上面這兩個庫來與memcache服務通信(有現成開源的庫,直接用,就像openssl庫一樣,里面有很多成熟算法了,這方面沒人自己去重復造輪子,使用現成開源的openssl庫)。
比如java操作memcache服務端,也是這樣。那么php操作memcache服務,有兩個擴展來操作,就是memcache和memcached。這兩個擴展的本質區別就是封裝的庫(c語言庫)不同。
一個是libmemcache庫,一個是libmemached庫。
ps:擴展是php里面的叫法,英文是extension,php引擎支持擴展的形式動態加模塊進去用。
進入主題,php的memcache擴展和memcached擴展的區別
1、基於的庫不同(我覺得這是本質區別,庫的不同決定了后續差異)。memcache擴展是原生的(基於pecl擴展庫)。memcached擴展是基於libmemcached庫開發的,所以支持cas操作,cas操作就是多個線程並發修改同一個key的值的時候能夠進行處理。
memcache.so和 memcached.so是兩個擴展文件名稱(php中擴展在linux下是.so后綴,window下是dll文件)。也就是后者就要libmemcached庫來實現。
2、mc支持面向對象和面向過程兩套接口操作服務端。而mcd擴展只支持面向對象方式操作。這也是庫(libmemcached與libmemcache)的不同影響的。
3、 memcached支持Binary Protocol,而memcache不支持。還是庫的不同導致。這意味着memcached會有更高的性能。
通過$m->setOption(Memcached::OPT_BINARY_PROTOCOL,true) 設置二進制協議。
ps:理論上二進制解碼速度快於文本,但實際優勢微乎其微。且目前大部分用戶還是使用文本協議,比較簡單穩定。實踐中使用二進制的還是比較少。
4、mcd擴展提供session處理模塊:provides a session handler
糾正:這個其實不是區別來着。從php.net官網上看到,memache擴展也支持的。
原文是這樣寫的:
在靜態編譯到php中時使用選項 --disable-memcache-session 可以關閉memcache的session 支持(默認時開啟的)
四、版本
使用一些服務,比如騰訊雲服務,會特意php操作他們的nosql要用哪個客戶端版本。有點暈。
memcached擴展,其實本質是封裝了libmemached庫。但memcached擴展的最新版本目前是2.x.x版本。
我看了一下libmemcached庫的官網,2014年2月的時候,最新版是libmemcached-1.0.18.tar.gz。所以還是1.x.x版本啊。
我之前有個疑惑:memcache擴展和memcached擴展,是哪里出的。官網是哪里?
發現了,這兩個擴展其實是php官方在維護,從http://pecl.php.net/下載。
只不過這兩個擴展編譯的時候的前提條件是要先有libmemcached或libmemcache庫
我截圖了幾張,備忘一下
14年4月,memcached擴展的最新版是2.2.0版本
13年4月,memcache擴展的最新版是3.0版本
2014年11月20日糾正理解偏差:
我以為這兩個擴展安裝的時候是封裝好了libmemcached庫或libmemcache庫的。所以我之前納悶,怎么下載頁面的修改歷史中並沒有看到列出的庫的版本。是我理解錯誤。
編譯這兩個擴展的時候,都需要指定libmemcached庫或libmemcache庫的的安裝路徑的。所以預先安裝好libmemcached(memcache擴展依賴的是libmemcache庫)是編譯這個擴展的先決條件。要記得先編譯安裝好。如下指定安裝目錄用--with-libmemcached-dir=DIR 來指定路徑。這個路徑就是安裝libmemcached時指定的prefix的值(prefix是指定安裝目錄)
如果沒有指定這個路徑項,就會去這些庫的默認標准安裝目錄找(我不知道去哪里找),所以最好是指定庫的位置來安裝(可控性強,以后遇到問題方便排查原因,比如以前編譯php使用pcre擴展,最好使用php引擎內置的pcre庫,使用linux系統上面的,容易出現編碼支持問題)。
====================================
還有一個libmemcached.so
擴展。這個不常用。所以我們以前沒見到過。
memcached與libmemcached庫的區別
這兩個是連接memcached服務端的兩個不同的客戶端,只是不是給php語言使用的。是給c/c++語言使用的(本來就是用c編寫的一個庫)
libmemcached 是 C/C++ 語言下的操作 memcache 服務器端的客戶端庫, 因為 PHP 的擴展也是用 C/C++ 寫的, 所以編譯安裝 memcached.so 時依賴 libmemcached庫也是可以理解的(得先安裝這個庫).