1. 程式人生 > >Memcache與Memcached最新詳細解析

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 的分散式是什麼意思?
下面假設memcached 伺服器有node1~node3 三臺,應用程式要儲存鍵名為“tokyo”、“kanagawa”、“chiba”、“saitama”、“gunma”的資料首先向memcached 中新增“tokyo”。將“tokyo”傳給客戶端程式庫後,客戶端實現的演算法就會根據“鍵”來決定儲存資料的memcached 伺服器。伺服器選定後,即命令它儲存“tokyo”及其值。同樣,“kanagawa”、“chiba”、“saitama”、“gunma”都是先選擇伺服器再保接下來獲取儲存的資料。獲取時也要將要獲取的鍵“tokyo”傳遞給函式庫。函式庫通過與資料儲存時相同的演算法,根據“鍵”選擇伺服器。使用的演算法相同,就能選中與儲存時相同的伺服器,然後傳送get 命令。只要資料沒有因為某些原因被刪除,就能獲得儲存的值。這樣,將不同的鍵儲存到不同的伺服器上,就實現了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的擴充套件)