memcached架構及緩存策略

----------------------------------------概述----------------------------------------php

Memcached是一套高性能分佈式內存對象緩存服務器數據庫

它將全部的數據通通保存在內存中,在內存中會維護一個巨大的hash表,支持任意存儲類型的數據,不少網站經過Memcached提升網站的訪問速度,尤爲是對於大型的須要頻繁訪問的網站,減小查詢效率,提升查詢速度後端

 

----------------------------------------架構----------------------------------------緩存

C/S架構:服務器

服務端:Memcached服務端,經過C語言編寫而成架構

客戶端:Memcached API客戶端,能夠經過任何語言編寫,如php、py等分佈式

特色:ide

1.爲了提升性能,memcached中保存的數據都存儲在memcached內置的內存空間中:因爲數據僅存在於內存中,所以重啓memcached、重啓操做系統會致使所有數據消失memcached

2.基於libevent的事件處理:libevent是個程序庫,它將Linux的epoll、BSD類操做系統的kqueue等事件處理功能封裝成統一的接口;即便對服務器的鏈接數增長,也能發揮O(1)的性能;memcached使用這個libevent庫,所以能在Linux、BSD、Solaris等操做系統上發揮其高性能性能

3.簡單key/value存儲:服務器不關心數據自己的意義及結構,只要是可序列化數據便可;存儲項由「鍵、過時時間、可選的標誌及數據」四個部分組成

4.功能的實現一半依賴於客戶端,一半基於服務器端:客戶負責發送存儲項至服務器端、從服務端獲取數據以及沒法鏈接至服務器時採用相應的動做;服務端負責接收、存儲數據,並負責數據項的超時過時

 

----------------------------------------緩存策略----------------------------------------

Slab Allocator機制基本原理:

按照預先規定的大小,將分配的內存分割成特定長度的塊chunk,並把尺寸相同的塊分紅組,以徹底解決內存碎片問題。但因爲分配的是特定長度的內存,所以沒法有效利用分配的內存。好比將100字節的數據緩存到128字節的chunk中,剩餘的28字節就浪費了;按照預先規定的大小,將分配的內存分割成特定長度的內存塊chunk,再把尺寸相同的內存塊分層組chunk集合,這些內存不會釋放,能夠反覆利用


Slab Allocation機制角色:

1.chunk爲固定大小的內存空間,默認爲96Byte

2.page對應實際的物理空間,1個page爲1M

3.一樣大小的chunk集合又稱爲slab


客戶端選擇slab機制:

下面說明memcached如何針對客戶端發送的數據選擇slab並緩存到chunk中;memcached根據收到的數據的大小,選擇最適合數據大小的slab; memcached中保存着slab內空閒chunk的列表,根據該列表選擇chunk, 而後將數據緩存於其中


內存釋放機制:

Laxzy Expiration:

Memcached每一個被存取的對象都有惟一的標識符key,存取操做均經過key進行,例如能夠把後端數據庫中的select操做提取出來,而後對相應的SQL進行hash計算得出key,而後以這個key在memcached中查找數據,若是數據不存在,說明其還沒有被寫入緩存中,並設置一個失效時間(好比1小時),在失效時間內的數據都是從緩存中提取,這樣就有效地減小了數據庫的壓力

Least Recently Used(LRU):

刪除「最近最少使用」的記錄的機制;當memcached的內存空間不足時,從最近未被使用的記錄中搜索,並將其空間分配給新的記錄;-M 參數禁止LRU功能,內存用盡時,memcached會返回錯誤,不建議使用memcached -M -m 1024

相關文章
相關標籤/搜索