Memcached工作原理
@[memcached]
[toc]
1. Memcached軟體工作原理
- memcached是一套C/S模式架構的軟體,在伺服器端啟動服務守護程序,可以為memcached伺服器指定監聽的IP位址、端口号、并發通路連接配接數、以及配置設定多少記憶體來處理用戶端的請求的參數;
- memcached軟體是由C語言來實作的,全部代碼僅有2000多行,采用的是異步I/O,其實作方式是基于事件的單程序和單線程的。使用libevent作為事件通知機制,多個伺服器端可以協同工作,但這些伺服器端之間是沒有任何通信聯系的,每個伺服器隻對自己的資料進行管理。應用程式端通過指定緩存伺服器的IP位址和端口,就可以連接配接memcached服務進行互相通信。
- 需要被緩存的資料以Key/Value鍵值對的形式儲存在伺服器端預配置設定的記憶體空間中,每個被緩存的資料都有唯一的辨別Key,操作memcached中的資料是通過這個唯一辨別Key進行的。緩存到Memcached中的資料僅放置在memcached服務預配置設定的記憶體中,而非儲存在磁盤中,是以存取速度非常快;
- 由于Memcached服務自身沒有對緩存的資料進行持久性存儲的設計,是以,在伺服器端的memcached服務程序重新開機之後,存儲在記憶體中的這些資料就會丢失。且當記憶體中緩存的資料容量達到啟動時設定的記憶體值時,就自動使用LRU(最近最少使用算法)算法删除過期的緩存資料。
- memcached軟體開發的早,當初僅為緩存而設計的,是以在設計之初并沒有過多考慮資料的永久性問題。是以如果使用memcached作為緩存資料服務,要考慮資料丢失後帶來的問題,例如:是否可以重新生成資料,還有,在高并發場合資料丢失會不會導緻網站架構雪崩。
- 為了滿足資料可以持久性保留的需求,sina網基于memcached服務開發了一款NoSQL軟體,名字叫MemcacheDB,可以實作在緩存的基礎上增加了持久緩存的特性。
- memcached支援各種語言編寫的用戶端API,包括PHP 、PYthon、Java、C等;
2. memcached的特性
memcached作為高并發、高性能的緩存服務,具有如下特征:
-
協定簡單
memcached的協定實作比較簡單,使用的是基于文本行的協定,能通過telnet直接操作memcached服務存取資料;
-
基于libevent的事件處理
簡單的說,libevent是一套得C開發的程式庫,它将BSD系統的kqueue、Linux系統的epoll等事件處理功能封裝成一個接口,確定即使伺服器端連接配接數增加,也能發揮很好的性能;
memcached就是利用這個庫進行異步事件處理。
-
内置的記憶體管理方式
memcached有一套自己管理記憶體的方式,這套管理方式非常高效,所有的資料都儲存在memcached内置的記憶體中,當存入的資料占滿記憶體空間時,memcached就使用LRU算法自動删除不使用的緩存,即重用過期資料的記憶體空間。memcached是為緩存系統設計的,是以,沒有考慮資料的容災問題,和機器的記憶體一樣,重新開機機器後資料将會丢失,如果希望重新開機資料依然能保留,那麼就需要采用sina網開發的memcachedb持久性記憶體緩存系統,當然還有常見的NoSQL服務,如:Redis,記憶體緩存:memcached,memcachedb,TokyoTyrant,MongoDB,Cassandra,redis,tair,CouchDB
linux運維人員必會開源運維工具體系:
http://oldboy.blog.51cto.com/2561410/775056 -
互不通信的memcached服務之間具有分布式特征
各個memcached伺服器之間互相不通信,都是獨立的存取資料,不共享任何資訊。通過對用戶端的設計,讓Memcached具有分布式功能,能支援海量緩存和大規模應用。
3. Memcached記憶體管理機制
- Memcached利用Slab Allocation機制來配置設定和管理記憶體。傳統的記憶體管理方式是:使用完通過malloc配置設定的記憶體後通過free來回收記憶體。這種方式容易産生記憶體碎片并降低作業系統對記憶體的管理效率。Slab Allocation機制不存在這樣的問題。它按照預先配置設定的大小,将配置設定的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,這些記憶體塊不會釋放,可以重複利用。
- Memcached伺服器端儲存着一個空閑的記憶體塊清單,當有資料存入時根據接收到的資料大小,配置設定一個能存下這個資料的最小記憶體塊。這種方式有時會造成記憶體浪費,例如:将200位元組的一個資料存入300位元組的一個記憶體塊中,就會有100位元組的記憶體被浪費掉,不能被使用。
避免浪費記憶體的辦法是:
- 預先計算出應用存入的資料大小,或把同一業務類型的資料存入一個Memcached伺服器中,确儲存入的資料大小相對均勻,這樣就可以減少記憶體的浪費。
- 還有一種辦法是,在memcached服務啟動時,通過“ -f ” 選項指定一個增長因子(或叫增長系數),它能控制記憶體組(slab)之間的大小差異。在應用中使用Memcached時,通常可以不重新設定這個參數,使用預設值1.25進行部署。如果想優化memcached對記憶體的使用,可以考慮重新計算資料的預期平均長度,調整這個參數來獲得合适的設定值。
4. Memcached 的删除機制
- 前面已經介紹過Memcached不會釋放已配置設定的記憶體空間,在資料過期後,用戶端不能通過Key取出它的值,其存儲空間被重新利用。
- Memcached使用的是一種Lazy Expiration 政策,自己不會監控存入的“Key/Value”對是否過期,而是在擷取Key值時檢視記錄的時間戳,檢查“key/value”鍵值對的空間是否過期。這種政策不會在過期檢測上浪費CPU資源。
- Memcached在配置設定空間時,優先使用已經過期的Key/Value鍵值對空間,當配置設定的記憶體空間占滿時,Memcached就會使用LRU(最近最少使用算法)算法來配置設定空間,删除最近最少使用的Key/Value鍵值對,将其空間配置設定給新Key/Value鍵值對。在某些情況下,如果不想使用LRU算法,那麼可以通過“-M” 參數來啟動Memcached,這樣Memcached在記憶體耗盡時,會傳回一個報錯資訊。