Memcached理解

1、Memcached簡介:數據庫

1. Memcached是一個自由開源的,高性能的,分佈式內存對象緩存系統。緩存

2. Memcached是一種基於內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據能夠是數據庫調用、API調用或者是頁面渲染的結果。通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。安全

3. Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的不少問題。其守護進程是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。它的API兼容大部分流行的開發語言。服務器

4. Memcached特色:網絡

1)基於C/S架構,協議簡單;(基於文本行的協議,可以使用telnet協議鏈接);架構

2)基於libevent的事件處理;(使用libevent來進行網絡併發鏈接的處理,在很大併發狀況下仍能保持快速的響應能力);併發

3)內置內存存儲方式;分佈式

4memcached不互相通訊的分佈式。memcached

 

2、Memcached內存分配:性能

1. 名詞理解:

1Page:分配給Slab的內存空間,默認是1MB,分配給Slab以後根據slab的大小切chunkpage一旦被分配,在memcached重啓前不會被回收或者從新分配。

2chunk:用於緩存記錄的內存空間。

3Slab Class:特定大小的chunk的組。每一個slab只負責必定大小範圍內的數據存儲。每一個slab中的chunk都是相同大小的。

2. pageslabchunk三者關係的理解:

1pagememcached在收到內存不夠的請求,並進行內存分配的單位。舉例來講,slab2的全部空間都用完了,又有大小適合slab2的數據過來了,那麼slab2就會向memcached請求新的內存空間,memcached就會劃分一個page大小的內存量到slab2page的默認大小是1M,這個數值能夠經過參數-I來修改。

2slabmemcached用來劃定存儲空間的大小概念,每當memcached啓動的時候,它會按照-n參數配置的值(若是有的話,不然爲默認值)來決定第一個slab的大小,而後根據-f參數的值來決定後續slab大小的增加速率,一個一個地決定後續的slab的大小,直到slab的大小達到設定的page大小(通常是1M)。 

3chunk是實際用來存儲數據的內存空間,它的大小和包含它的slab的大小是一致的。page大小的內存分配到slab的時候,slab會根據自身的大小將page大小的內存分割成 page / slabsize chunk

3. 數據存儲方式:Slab Allocation原理

  將分配的內存分割成各類尺寸的塊(chunk),並把尺寸相同的塊分紅組,以徹底解決內存碎片問題。Memcached根據收到的數據的大小,選擇最適合數據大小的slabMemcached中保存着slab內空閒chunk的列表,根據該列表選擇chunk,而後將數據緩存於其中。

優勢:不會存在內存碎片。

缺點:因爲分配的是特定長度的內存,因此沒法有效利用分配的內存。

4. 數據過時方式:Lazy Expiration + LRU(Least Recently Used

1Lazy ExpirationMemcached內部不會監視記錄是否過時,而是在get命令執行時查看記錄的時間戳,檢查記錄是否過時。若是某一個itemmemcached裏過時了,這個東西並不會被刪除,而是客戶端沒法再看見該記錄,其存儲空間便可重複使用。

注意:

  只有對一個key執行了get命令以後Memcached纔會知道這個key對應的值是否已過時,這點可使用命令來測試。當Memcached中的某些key對應的值過時以後,執行statssizes等統計命令的時候,Memcached仍是將它們當作未過時的數據,只有執行了get以後再執行統計命令,Memcached才知道哪些數據已過時。

  (2LRUMemcached會優先使用已超時的記錄的空間,當內存空間不足時,就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。

 

3、Memcached一些特性和限制:

1. memcached缺少認證以及安全管制,這表明應該將memcached服務器放置在防火牆後。

2. memcached不提供冗餘,當某個服務器S中止運行或崩潰了,全部存放在S上的鍵/值對都將丟失。

3. 往memcached存儲的全部數據,若是數據的大小分佈於各類chunk大小區間,64B1MB都有,可能會形成內存的極大浪費以及memcached的異常

4. 在Memcached中能夠保存的item數據量是沒有限制的,只要內存足夠。

5. Memcached單進程最大使用內存爲2G,若要使用更多內存,能夠多個端口開啓多個Memcached進程。

6. 最大30天的數據過時時間,設置爲永久的也會在這個時間過時,由常量REALTIME_MAXDELTA控制。

7. 最大鍵長爲250字節,大於該長度沒法存儲,由常量KEY_MAX_LENGTH控制。

8. 單個item最大數據是1MB,超過1MB不予存儲,由常量POWER_BLOCK控制。它是默認slab大小。

9. 最大同時鏈接數是200,經過conn_init()中的freetotal進行控制,最大軟鏈接數是1024經過settings.maxconns進行控制。

10. 參數settings.factorsettings.chunk_size分別控制slab的數據佔用和步進方式。

相關文章
相關標籤/搜索