Memcached是什麼?

Memcached是一個開源的、高性能的,具有分佈式內存對象的緩存系統,從名稱上看Mem就是內存的意思,而Cache就是緩存的意思,它通過在事先規劃的內存空間中緩存數據庫中的數據,以達到減少數據庫的高
併發訪問,從而達到提升數據庫的訪問性能,加速動態應用服務的能力。

Memcached 通過緩存經常被讀取的數據庫中的數據,當程序需要訪問後端數據庫獲取數據時會優先訪問Memcached內存緩存,如果緩存中有數據就直接返回前端服務應用,如果沒有數據(沒有命中)再轉發給後端的數據庫服務器,程序
服務取到Memcahced內存緩存中沒有的對應數據後,除了返回給用户數據外,還會吧數據在內存中進行緩存,等待下次被訪問,從而大大的減輕數據庫的壓力,提高整個網站架構的響應速度,提升了用户體驗。

當程序更新、刪除數據庫中已有的數據時,會同時發送請求通知Memcached已經緩存過的同一個ID內容的舊數據失效,從而保證
Memcached中的數據和數據庫中的數據一致。
當分配給Memcached內存空間用完之後,Memcached自身會使用LRU(Least Recently Used,最近最少使用)加到期失效策略,失效
的數據首先被替換掉,然後是最近未使用的數據被替換掉

為了緩解數據庫的高併發壓力,我們可以在數據庫層配置數據讀寫分離及讀數據庫做負載均衡,但是更有效更簡單的的策略是
部署Memcache服務作為一個緩存區域,把部分數據庫的信息保存在內存中,這樣前端的服務能夠迅速的讀取到原本在數據庫中
才能讀取到的數據。那麼,最重要的就是如何通過memcached服務分擔數據庫系統的壓力,由於單台Memcached的內存容量是有限的,
並且單台也是單點,因此,Memcached也有負載均衡及分佈式應用的場景。

【分佈式應用1】
Memcached支持分佈式,我們在應用服務器程序上改造,就可以更好的支持。例如:可以根據key適當進行有規律的封裝,比如以用户
為主的網站來説,每個用户都有UserID,那麼可以按照固定的ID來進行提取和存取,比如1開頭的用户保存在第一台Memcached服務器上,
以2開頭用户的數據保存在第二台Memcahced服務器上,存取數據都先按照UserID來進行相應的轉換和存取。
但是這個有缺點,就是需要對UserID進行判斷,如果業務不一致,或者其他類型的應用,可能不是那麼合適,那麼可以根據自己的實際
業務來進行考慮,或者去想更合適的方法。

【分佈式應用2】
在應用服務器上通過程序URL_HASH算法去訪問Memcached服務,Memcached服務器的地址池可以簡單的配在每個程序裏

【分佈式應用3】
門户如百度,會通過一箇中間件代理負載請求後後端的Cache服務

【分佈式應用4】
可以用常見的LVS、haproxy做Cache的負載均衡,和普通的應用服務相比,這裏的重點是調度算法,Cache一般會選擇url_hash,及一致性哈希算法

Memcached的特性

1、協議簡單
Memcached的協議實現比較簡單,使用的是基於文本行的協議,能通過telnet直接操作Memcached服務存取數據

2、基於libevent的事件處理
簡單的説,libevent是一套利用C開發的程序庫,它將BSD系統的kqueue,linux系統的epoll等事件功能封裝成一個接口,確保即使服務端的連接數增加也能
發揮很好的性能

3、內置的內存管理管理方式
Memcached有一套自己管理內存的方式,這套管理方式非常高效,所有的數據都保存在Memcached內置的內存中,當存入的數據佔滿內存空間時,Memcached使用
LRU算法自動刪除不使用的緩存數據,即重用過期數據的內存空間。Memcached是為緩存系統設計的,因此,沒有考慮數據的容災問題,和機器內存一樣,重啓
機器數據將會丟失

4、互不通信的Memcached之間具有分佈特徵
各個Memcached服務器之間互相不通信,都是獨立的存取數據,不共享任何信息。通過對客户端的設計,讓Memcached具有分佈式,能支持海量緩存和大規模應用

Memcached軟件工作原理
Memcached是一套C/S模式架構的軟件,在服務器段啓動服務守護進程,可以為memcached服務器指定監聽的IP地址、端口號、併發連接數以及分配多少內存來處理
客户端的請求的參數
應用程序端通過指定緩存服務器的IP地址和端口,就可以連接memcached服務互相通信。需要被緩存的數據以key/value鍵值對的形式保存在服務器段預分配的內存
區中,每個被緩存的數據都有唯一的標識key,操作memcached中數據通過這個唯一標識的key進行。緩存到Memcached中的數據僅放置在Memcached服務預分配的內存中,
而非存儲在memcached所在的磁盤上,因此存儲速度非常快。

Memcached內存管理機制
Memcached利用Slab Alloction機制來分配和管理內存。傳統的內存管理方式是:使用完通過malloc分配內存後通過free來回收。這種方式容易產生內存碎片並降低操作系統
對內存的管理效率。Slab Alloction機制不存在這樣的問題,它安裝預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分成組,這些內存塊不會釋放,
可以重複利用。
Memcached服務器端保存着一個空閒的內存塊列表,當有數據存入時根據接收到的數據大小,分配一個能存下這個數據的最小內存塊。這種方式有時會造成內存浪費,例如:將200字節的一個數據
存入300字節的一個內存塊中,會有100字節被浪費掉,不能被使用。避免浪費內存的辦法是,預先計算出應用存入的數據大小,或把同一業務類型的數據存入一個Memcached服務器中,確保存入的
數據大小相對均勻,這樣可以減少內存的浪費。
還有一種辦法是,在啓動時指定“-f”參數,能在某種程度上控制內存組之間的大小差異。在應用中使用Memcached時,通常不重新設置這個參數,使用默認值1.25進行部署。如果想優化Memcached對
內存的使用,可以考慮重新計算數據的預期平均長度,調整這個參數來獲得合適的設置值。

Memcached的刪除機制
Memcached不會釋放已分配的內存空間,除非添加數據設定過期或內存緩存滿了,在數據過期後,客户端不能通過key取出它的值,其存儲空間被重新利用。
Memcached使用的是一種Lazy Expiration策略,自己不會監控存入的的kay/value對是否過期,而是在獲取key值時查看記錄的時間戳,檢查key/value對空間是否過期。
這種策略不會再過期檢測上浪費cpu資源
Memcached在分配空間時,優先使用已經過期的key/value對空間,當分配的內存空間佔滿時,Memcached就會使用LRU算法來分配空間,刪除最近最少使用的key/value對,
將其空間分配給新的key/value對。在某些情況下,如果不想使用LRU算法,那麼可以通過“-M”參數來啓動Memcached,這樣,Memcached在內存耗盡時,會返回一個報錯信息。

 

每天進步一點,加油!