Memcache介紹、安裝、使用(一)

Memcache基礎

Memcache是由 Danga Interactive 開發並使用 BSD 許可的一種通用的分佈式內存緩存系統, 減少了網站數據庫的負載, 成爲如今世界上大多數高流量網站所使用的緩存解決方案。
它可以應對任意多個連接,使用非阻塞的網絡IO(NIO),它的工作機制是在內存中開闢一塊空間,然後建立一個HashTable,Memcached自管理這些HashTable。

爲什麼要用Memcache ?

許多Web應用都將數據保存到RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加重、數據庫響應惡化、網站顯示延遲等重大影響。memcached是高性能的分佈式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

爲什麼會有Memcache和memcached兩種名稱?

其實Memcache是這個項目的名稱,而memcached是它服務器端的主程序文件名,一個是項目名稱,一個是主程序文件名。

memcached 的客戶端使用TCP鏈接 與 服務器通訊。(UDP接口也同樣有效)一個運行中的memcached服務器監視一些(可設置)端口。客戶端連接這些端口,發送命令到服務器,讀取回應,最後關閉連接。

Memcache使用場景

數據庫層中執行幾個經常性查詢時,memcached 往往能發揮最大的效用。我經常會在數據庫和應用服務器之間設置一系列 memcached 實例,並採用一種簡單的模式來讀取和寫入這些服務器。

這裏寫圖片描述

建立了一個 Web 層,其中包括一些 Apache 實例。下一層是應用程序本身。這一層通常運行於 Apache Tomcat 或其他開源應用服務器之上。再下面一層是配置 memcached 實例的地方 — 即應用服務器與數據庫服務器之間。

讀取數據過程

執行讀取操作的順序是從 Web 層獲取請求(需要執行一次數據庫查詢)並檢查之前在緩存中存儲的查詢結果。如果我找到所需的值,則返回它。如果未找到,則執行查詢並將結果存儲在緩存中,然後再將結果返回給 Web 層。

寫入數據過程

將數據寫入到數據庫中時,首先需要執行數據庫寫入操作,然後將之前緩存的任何受此寫入操作影響的結果設定爲無效。此過程有助於防止緩存和數據庫之間出現數據不一致性

Memcache特徵

  • 協議簡單
  • 基於libevent(C開發)的事件處理
  • 內置內存存儲方式
  • memcached不互相通信的分佈式

 協議簡單
服務器客戶端通信並不使用複雜的XML等格式,而使用簡單的基於文本行的協議、

 基於libevent的事件處理
它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的接口。即使對服務器的連接數增加,也能發揮O(1)的性能。

 內置內存存儲方式
memcached中保存的數據都存儲在memcached內置的內存存儲空間, 因此重啓memcached、重啓操作系統會導致全部數據消失。內容容量達到指定值之後,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。

 memcached不互相通信的分佈式
儘管是“分佈式”緩存服務器,但服務器端並沒有分佈式功能。各個memcached不會互相通信以共享信息,它的分佈式,取決於客戶端的算法實現。
另:幾種java版本Memcache客戶端比較
http://jingyan.baidu.com/article/14bd256e207a12bb6d2612c5.html

這裏寫圖片描述

Memcache內存存儲機制

Slab Allocation機制:整理內存以便重複使用

基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題。將分配的內存分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk的集合)

這裏寫圖片描述

Slab allocation的術語

  1. Page
    分配給Slab的內存空間,默認是1MB。分配給Slab之後根據slab的大小切分成chunk
  2. Chunk
    用於緩存記錄的內存空間。
  3. Slab Class
    特定大小的chunk的組。

Slab Allocation的緩存原理

memcached根據收到的數據的大小,選擇最適合數據大小的slab。memcached中保存着
slab內空閒chunk的列表,根據該列表選擇chunk,然後將數據緩存於其中。

這裏寫圖片描述

由於分配的是特定長度的內存,因此無法有效利用分配的內存。例如,將100字節
的數據緩存到128字節的chunk中,剩餘的28字節就浪費了

這裏寫圖片描述

memcached在啓動時指定Growth Factor因子(通過f選項),就可以在某種程度上控制slab之間的差異。

將memcached引入產品,或是直接使用默認值進行部署時,最好是重新計算一下數據的預期平均長度,調整growth factor,以獲得最恰當的設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章