深入研究memcache 特性和限制

2022-04-03 16:28:24 字數 2969 閱讀 7689

特性和限制

在 memcached中可以儲存的item資料量是沒有限制的,只要記憶體足夠 。

memcached

單程序最大使用記憶體為2g,要使用更多記憶體,可以分多個埠開啟多個memcached程序最大30天的資料過期時間,設定為永久的也會在這個時間過期,

常量realtime_maxdelta 60*60*24*30控制最大鍵長為250位元組,大於該長度無法儲存,常量key_max_length

250控制單個item最大資料是1mb,超過1mb資料不予儲存,常量power_block 1048576進行控制,它是預設的slab大小

最大同時連線數是200,通過

conn_init()中的freetotal進行控制,最大軟連線數是1024,通過settings.maxconns=1024

影響slab的資料占用和步進方式memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,由於無阻塞通訊,對記憶體讀寫速度

非常之快。

memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,應用於分布式的服務非常廣泛。

memcached作為小規模的資料分布式平台是十分有效果的。

memcached

是鍵值一一對應,key預設最大不能超過128個字

節,value預設大小是1m,也就是乙個slabs,如果要存2m的值(連續的),不能用兩個slabs,因為兩個slabs不是連續的,無法在記憶體中

儲存,故需要修改slabs的大小,多個key和value進行儲存時,即使這個slabs沒有利用完,那麼也不會存放別的資料。

# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -p /tmp/memcached.pid

-d選項是啟動乙個守護程序,

-m是分配給memcache使用的記憶體數量,單位是mb,我這裡是10mb,

-u是執行memcache的使用者,我這裡是root,

-l是監聽的伺服器ip位址,如果有多個位址的話,我這裡指定了伺服器的ip位址192.168.0.200,

-p是設定memcache監聽的埠,我這裡設定了12000,最好是1024以上的埠,

-c選項是最大執行的併發連線數,預設是1024,我這裡設定了256,按照你伺服器的負載量來設定,

-p是設定儲存memcache的pid檔案,我這裡是儲存在 /tmp/memcached.pid,

2)如果要結束memcache程序,執行:

# kill `cat /tmp/memcached.pid`

memcache使用了slab allocator的記憶體分配機制:按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。memcache的儲存涉及到slab,page,chunk三個概念

1.chunk為固定大小的記憶體空間,預設為96byte。

2.page對應實際的物理空間,1個page為1m。

3.同樣大小的chunk又稱為slab。

memcached再啟動的時候根據-n和-f引數,產生若干slab。具體應用中memcache每次申請1page,並將這1m空間分割成若干個chunk,這些chunk有著同樣的大小,屬於同乙個slab。

【新增】

通過memcache新增item的時候:

1. memcache計算item的大小(key+value+flags),選取合適的slab(剛好能放下該item的slab)

2. 如果這個item對應的slab未出現過,則申請1個page(注意,這1m空間不論是否達到memcached使用記憶體都可以申請成功)並加該item存入slab中的chunk3.

如果item對應的slab出現過,則在該slab中優先選擇expired(free_chunks)和delete(在1.2.2中delete的

chunk存在著不能被重複利用的問題)的chunk進行儲存,其次將選擇未使用過的chunk(free_chunks_end)進行儲存。

4. 如果item對應的slab出現過,但是對應的slab已經儲存滿了,那麼會申請乙個新的page,這個page被分為對應大小的chunk,繼續儲存。

5. 如果item對應的slab出現過,但是對應的slab已經儲存滿了並且memcache也達到了最大記憶體使用。將使用lru演算法,清除item(可能將未過期的item清除)此時會有eviction++

【刪除】:

1. delete操作只是將該chunk置為刪除狀態,這樣在下次使用將優先利用這樣的chunk。

【flush】

1. flush操作相當於將所有的item失效的乙個動作。並不會改變memcache記憶體分配情況。

【一些注意】

1. memcache已經分配的記憶體不會再主動清理。

2. memcache分配給某個slab的記憶體頁不能再分配給其他slab。

3. flush_all不能重置memcache分配記憶體頁的格局,只是給所有的item置為過期。

4. memcache最大儲存的item(key+value)大小限制為1m,這由page大小1m限制

5.由於memcache的分布式是客戶端程式通過hash演算法得到的key取模來實現,不同的語言可能會採用不同的hash演算法,同樣的客戶端程式也有可能

使用相異的方法,因此在多語言、多模組共用同一組memcached服務時,一定要注意在客戶端選擇相同的hash演算法

6.啟動memcached時可以通過-m引數禁止lru替換,在記憶體用盡時add和set會返回失敗

7.memcached啟動時指定的是資料儲存量,沒有包括本身占用的記憶體、以及為了儲存資料而設定的管理空間。因此它占用的記憶體量會多於啟動時指定的記憶體分配量,這點需要注意。

8.memcache儲存的時候對key的長度有限制,php和c的最大長度都是250

深入研究memcache 特性和限制

特性和限制 在 memcached中可以儲存的item資料量是沒有限制的,只要記憶體足夠 memcached 單程序最大使用記憶體為2g,要使用更多記憶體,可以分多個埠開啟多個memcached程序最大30天的資料過期時間,設定為永久的也會在這個時間過期,常量realtime maxdelta 60...

flex Bindable深入研究

bindable 元資料標籤,它在 中的作用就是向編譯器提供如何編譯程式的資訊。它的最大作用是使程式元件間的資料同步變得容易。在開發中通常用上bindable作用在檢視控制項上,如給它繫結乙個物件,則以後只需要在邏輯層更改這個物件的值,則檢視層的控制項資料會自動更新 同步 而不再需要手動去更新檢視。...

URLRequest深入研究

urlrequest 的乙個例項 html view plain copy create the request.所構建的nsurlrequest具有乙個依賴於快取響應的特定策略,cachepolicy取得策略,timeoutinterval取得超時值 nsurlrequest therequest...