memcached原理及介紹
memcached是一種快取技術,在儲存在記憶體中(高效能分散式記憶體快取伺服器).目的 : 提速.(傳統的都是把資料儲存在關係型資料庫管理系統既RDBMS,客戶端請求時會從RDBS中
讀取資料並在瀏覽器中顯示,這樣當訪問量過大時或集中時,導致RSBMS負擔過重,資料庫響應惡化,瀏覽器中顯示延遲等嚴重問題,使用memcached減少資料庫查詢和訪問次數以
提供訪問速度,提供擴充套件性)memcached為key->value非關係型資料庫,key為一般子串,值唯一.value除了php中的資源不能存,其它的資料都能儲存(字串,數值,陣列,物件,布林值
,null,二進位制<圖片,視訊>)
提速方法 :
1.傳統 : 模擬cached方法(儲存到資料庫時生成一份靜態檔案到磁碟中)
2.直接操作記憶體(記憶體表,memcached服務維持了一張記憶體表hashdata)
3.CPU暫存器(最高速的,但是代價成本高)
memcached特徵 :
1.協議簡單(文字行協議)
2.基於libevent事件處理(注 : libevent是一個程式庫,封裝了linux的epoll,BSD等作業系統的kqueue等事件處理功能.即使對伺服器的連線數新增,也能發揮O(1)的效能.
memcached在linux,BSD等作業系統上能發揮其高效能.)
3.內建記憶體儲存方式(儲存在memcached內建的記憶體儲存空間中,提高效能.問題 : memcached重啟或作業系統重啟資料會丟失,達到一定量後會啟動演算法自動刪除不使用的快取)
4.不互相通訊的分散式(不互相通訊共享資訊)
memcached作用 :
1.高效能分散式快取伺服器(快取資料庫查詢結果,減少資料庫訪問次數)
快取讀取/寫入過程 : 首次訪問 : 從RDBMS中取得資料儲存到memcached;第二次後 : 從memcached中取得資料顯示頁面.
memcached適合做的東西 :
1.訪問頻繁的字典資料
2.大量的hot資料(熱門資料快取)
3.頁面快取(web站常用)
4.搜尋的查詢條件和結果(熱門搜尋的記憶體快取起來)
5.臨時處理資料(不需要入庫,排重)
memcached工作原理 :
memcached的工作就是在專門的機器的記憶體裡維護一張巨大的hash表,來儲存經常被讀寫的一些陣列與檔案,從而極大的提高網站的執行效率.
採用的是C/S模式,在server端啟動服務程序,在啟動時可以指定監聽的ip,自己的埠號,所使用的記憶體大小等幾個關鍵引數.採用了單程序,單執行緒,非同步I/O,基於事件(event_based)
的服務方式.使用libevent作為事件通知實現.每個Server只是對自己的資料進行管理.Client端通過指定Server端的ip地址(通過域名應該也可以).以key->value形式,key
的值通過hash進行轉換,然後確定對那臺server儲存/獲取資料.
memcached記憶體演算法 :
使用的是slab allocation機制分配和管理記憶體,按照預先規定的大小,將分配的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,資料在存放時,根據鍵值大小去
匹配slab大小,找就近的slab存放,所以存在空間浪費現象.
memcached快取策略 :
是LRU(最近最少使用)加上到期失效策略.當你在memcached記憶體儲資料項時,你有可能會指定它在快取的失效時間,預設為永久.當memcached伺服器用完分配的記憶體時,失效的
資料被首先替換,然後也是最近使用的資料.在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/value對是否過期,而是在獲取key值時檢視記錄
的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載.
memcached失效策略 :
Lazy expiration + LRU
Lazy expiration作用 : 假如我們所儲存的資料項相對多的時候,在這時候進行監控的話,話費的代價是相當大的,所以memcached不會在過期監視上耗費風度哦的CPU時間,
從而在效能方法也起到一定的優化作用.
LRU : memcached會優先使用已超時的空間,但是還是會有追加資訊時空間不足的狀態,這時候會使用Least Recently Used(LRU)機制來分配空間,就從最近未被使用的記錄
中搜索,並將其空間分配給新的記錄.
memcached分散式演算法 :
當向memcached叢集存入/取出Key/value時,memcached客戶端會根據一定演算法計算存入那臺伺服器.(第一步 : 選擇伺服器,第二步 : 存取資料)
餘數演算法 : 先求得鍵的整數雜湊值,再除以伺服器數量,根據餘數覺得儲存那臺伺服器.(特點 : 簡單,高效.但是擴充套件性差,伺服器數量變更時,幾乎所有的快取都會失效)
雜湊演算法 : 先計算memcached的雜湊值,並將其釋出在0-2^32的圓上,然後用同樣的方法算出儲存資料鍵的雜湊值並對映至圓上,最後從資料對映到的位置開始順時針查詢,
將資料儲存在查詢到的第一臺伺服器,如果超過2^32還是找不到,則將資料儲存在第一臺memcached伺服器上.如果新增一臺memcached伺服器,則只在圓上新增的逆時針方向
的第一臺伺服器上的鍵會受到影響.
memcached與redis比較
memcached : 支援多核,記憶體利用率高,無永續性,資料結構簡單.
redis : 單核,記憶體利用率低(採用壓縮會比memcached高),有(硬碟儲存,主從同步),資料結構複雜.
註釋 :
雜湊值 : 將值從一個大的(可能很大)定義域對映到一個較小值域的(數學)函式.雜湊函式是把該函式應用到大的定義域中的若干值得(大)集合的結果可以均勻地(和隨機地)
被分佈在該範圍上.