----------------------------------------概述----------------------------------------
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