Memcache與Memcached最新詳細解析
在近期的搭配環境中學習了memcache、memcached、php-memcache、php-memcached等的異同,通過查詢大量資料以及實踐總結出本篇文章。
一、memcache
Memcache是一個高效能的分散式的記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
一般目的可總結為:通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態 Web應用的速度、提高可擴充套件性。
MemCache的工作流程(如下圖):
先檢查客戶端的請求資料是否在memcached中,如有,直接把請求資料返回,不再對資料庫進行任何操作。
如果請求的資料不在memcached中,就去查資料庫,把從資料庫中獲取的資料返回給客戶端,同時把資料快取一份到memcached中(memcached客戶端不負責,需要程式明確實現)。
每次更新資料庫的同時更新memcached中的資料,保證一致性。
二、memcached
Memcache是該系統的專案名稱,Memcached是該系統的主程式檔案(字母d可以理解為daemon:守護程序),以守護程式方式運行於一個或多個伺服器中,隨時接受客戶端的連線操作,使用共享記憶體存取資料。
memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,由於無阻塞通訊,對記憶體讀寫速度非常之快。memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,應用於分散式的服務非常廣泛。
memcached作為小規模的資料分散式平臺是十分有效果的。
其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。
memcached有以下幾點特徵:
- 協議簡單:memcached的伺服器客戶端通訊並不使用複雜的XML等格式,而使用簡單的基於文字行的協議。
- 基於libevent的事件處理:libevent是個程式庫,它將Linux的epoll、BSD類作業系統的kqueue等事件處理功能封裝成統一的介面。memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等作業系統上發揮其高效能。
內建記憶體儲存方式:為了提高效能,memcached中儲存的資料都儲存在memcached內建的記憶體儲存空間中。由於資料僅存在於記憶體中,因此重啟memcached、重啟作業系統會導致全部資料消失。另外,內容容量達到指定值之後,使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料。
通訊分散式:memcached儘管是“分散式”快取伺服器,但伺服器端並沒有分散式功能。各個memcached不會互相通訊以共享資訊。那麼,怎樣進行分散式呢?這完全取決於客戶端的實現。
memcached 的分散式是什麼意思?
三、PHP針對memcache有兩個PECL擴充套件,一個是php-memcache、一個是php-memcached
memcache擴充套件是完全在PHP框架內開發的,memecached是基於原生的c的libmemcached的擴充套件,更加完善以及強大。
可以說php-memcached是php-memcache的升級版,增強版。建議使用memcached擴充套件。
二者區別:
- memcache是原生實現的,但是使用libmemcached的memached只支援OO介面,而 memcache則是OO和非OO兩套介面均支援。
- memcached,還有個非常稱讚的地方,就是flag不是在操作的時候設定了。而是有一個統一的setOption()。memcached 實現了更多的 memcached 協議。
- 最重要的一點,memcached 支援 Binary Protocol(二進位制協議,即可由機器直接讀取),而 memcache 不支援,意味著 memcached 會有更高的效能。
- 網上廣泛流傳著這樣的說法,講述php的兩個擴充套件模組memcache和memcached的區別,其中特意強調了memcached與memcached一個很大的區別是memcached模組不支援長連線。其實不然,memcached擴充套件模組從很早的版本開始就已經支援長連線了。
總結:
memcache的主程序名字memcached與php中一個memcache副檔名相同,但概念切勿混淆。
php-memcache、php-memcached是php的擴充套件,是用於通過php使用memcached的。
如果安裝了memcached而不安裝相應的php擴充套件,那麼php無法操控memcached,但是終端上面可以正常使用memcached。
memcached也是一種伺服器,是記憶體快取伺服器,其客戶端是指開發者用的語言例如php、python、等,這些相對於伺服器就是客戶,可以理解為php-memcache、php-memcached就是php與memcache的客戶端。
下圖形象的說明了以上概念的關係(每種語言都有自己對memcache的擴充套件)