—————————————-概述—————————————-
Memcached是一套高性能分布式內(nèi)存對象緩存服務器。它將所有的數(shù)據(jù)統(tǒng)統(tǒng)保存在內(nèi)存中,在內(nèi)存中會維護一個巨大的hash表,支持任意存儲類型的數(shù)據(jù),很多網(wǎng)站通過Memcached提高網(wǎng)站的訪問速度,尤其是對于大型的需要頻繁訪問的網(wǎng)站,減少查詢效率,提高查詢速度
—————————————-架構(gòu)—————————————-
C/S架構(gòu):
服務端:Memcached服務端,通過C語言編寫而成
客戶端:Memcached API客戶端,可以通過任何語言編寫,如php、py等
特點:
1.為了提高性能,memcached中保存的數(shù)據(jù)都存儲在memcached內(nèi)置的內(nèi)存空間中:由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會導致全部數(shù)據(jù)消失
2.基于libevent的事件處理:libevent是個程序庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口;即使對服務器的連接數(shù)增加,也能發(fā)揮O(1)的性能;memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能
3.簡單key/value存儲:服務器不關(guān)心數(shù)據(jù)本身的意義及結(jié)構(gòu),只要是可序列化數(shù)據(jù)即可;存儲項由“鍵、過期時間、可選的標志及數(shù)據(jù)”四個部分組成
4.功能的實現(xiàn)一半依賴于客戶端,一半基于服務器端:客戶負責發(fā)送存儲項至服務器端、從服務端獲取數(shù)據(jù)以及無法連接至服務器時采用相應的動作;服務端負責接收、存儲數(shù)據(jù),并負責數(shù)據(jù)項的超時過期
—————————————-緩存策略—————————————-
Slab Allocator機制基本原理:
按照預先規(guī)定的大小,將分配的內(nèi)存分割成特定長度的塊chunk,并把尺寸相同的塊分成組,以完全解決內(nèi)存碎片問題。但由于分配的是特定長度的內(nèi)存,因此無法有效利用分配的內(nèi)存。比如將100字節(jié)的數(shù)據(jù)緩存到128字節(jié)的chunk中,剩余的28字節(jié)就浪費了;按照預先規(guī)定的大小,將分配的內(nèi)存分割成特定長度的內(nèi)存塊chunk,再把尺寸相同的內(nèi)存塊分層組chunk集合,這些內(nèi)存不會釋放,可以反復利用
Slab Allocation機制角色:
1.chunk為固定大小的內(nèi)存空間,默認為96Byte
2.page對應實際的物理空間,1個page為1M
3.同樣大小的chunk集合又稱為slab
客戶端選擇slab機制:
下面說明memcached如何針對客戶端發(fā)送的數(shù)據(jù)選擇slab并緩存到chunk中;memcached根據(jù)收到的數(shù)據(jù)的大小,選擇最適合數(shù)據(jù)大小的slab; memcached中保存著slab內(nèi)空閑chunk的列表,根據(jù)該列表選擇chunk, 然后將數(shù)據(jù)緩存于其中
內(nèi)存釋放機制:
Laxzy Expiration:
Memcached每個被存取的對象都有唯一的標識符key,存取操作均通過key進行,例如可以把后端數(shù)據(jù)庫中的select操作提取出來,然后對相應的SQL進行hash計算得出key,然后以這個key在memcached中查找數(shù)據(jù),如果數(shù)據(jù)不存在,說明其尚未被寫入緩存中,并設(shè)置一個失效時間(比如1小時),在失效時間內(nèi)的數(shù)據(jù)都是從緩存中提取,這樣就有效地減少了數(shù)據(jù)庫的壓力
Least Recently Used(LRU):
刪除“最近最少使用”的記錄的機制;當memcached的內(nèi)存空間不足時,從最近未被使用的記錄中搜索,并將其空間分配給新的記錄;-M 參數(shù)禁止LRU功能,內(nèi)存用盡時,memcached會返回錯誤,不建議使用memcached -M -m 1024