概述 Memcached是一套高性能分散式記憶體對象緩存伺服器 它將所有的數據統統保存在記憶體中,在記憶體中會維護一個巨大的hash表,支持任意存儲類型的數據,很多網站通過Memcached提高網站的訪問速度,尤其是對於大型的需要頻繁訪問的網站,減少查詢效率,提高查詢速度 架構 C/S架構: 服務端:Me ...
----------------------------------------概述----------------------------------------
Memcached是一套高性能分散式記憶體對象緩存伺服器
它將所有的數據統統保存在記憶體中,在記憶體中會維護一個巨大的hash表,支持任意存儲類型的數據,很多網站通過Memcached提高網站的訪問速度,尤其是對於大型的需要頻繁訪問的網站,減少查詢效率,提高查詢速度
----------------------------------------架構----------------------------------------
C/S架構:
服務端:Memcached服務端,通過C語言編寫而成
客戶端:Memcached API客戶端,可以通過任何語言編寫,如php、py等
特點:
1.為了提高性能,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