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