memcached telnet命令


連接

cmd下執行:

格式:telnet ip port,如下:

telnet 127.0.0.1 11211

如連接失敗,顯示

 

 memcached telnet命令 - 白楊 - 白楊的博客

 

退出

quit

 

命令說明:

一、存儲命令

存儲命令的格式:

?

1

2

<command name> <key> <flags> <exptime> <bytes>

<data block>

參數說明如下:

<command name>

set/add/replace

<key>

查找關鍵字

<flags>

整型參數,客戶機使用它存儲關於鍵值對的額外信息

<exptime>

該數據的存活時間(以秒為單位,0 表示永遠) 

<bytes>

存儲字節數

<data block>

存儲的數據塊(可直接理解為key-value結構中的value)

1、添加

(1)、無論如何都存儲的set,如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。

set a 0 0 4

1234

回顯:

STORED

可以通過“get key”的方式查看添加進去的記錄:

get a

回顯:

VALUE a 0 4

1234

END

 

(2)、只有數據不存在時進行添加的add

add b 0 0 3

123

STORED

如果key已經存在,則回顯

NOT_STORED

 

(3)、只有數據存在時進行替換的replace

replace b 0 0 2

aa

STORED

如果key不存在,則回顯

NOT_STORED

 

2、刪除

命令:delete key

刪除已存在的鍵值和不存在的記錄可以返回不同的結果

delete c

NOT_FOUND

delete b

DELETED

 

3、修改

命令:delete key

刪除已存在的鍵值和不存在的記錄可以返回不同的結果

二、讀取命令

1get

get命令的key可以表示一個或者多個鍵,鍵之間以空格隔開

獲取一個

get b

VALUE b 0 2

aa

END

獲取多個

get a b

VALUE a 0 4

1234

VALUE b 0 2

aa

END

 

2gets

gets命令比普通的get命令多返回了一個數字。這個數字可以檢查數據是否發生改變。當key對應的數據改變時,這個多返回的數字也會改變。

get a

VALUE a 0 4

1234

END

gets a

VALUE a 0 4 2

1234

END

 

get b

VALUE b 0 2

aa

END

gets b

VALUE b 0 2 5

aa

END

 

3cas

cas即checked and set的意思,只有當最后一個參數和gets所獲取的參數匹配時才能存儲,否則返回“EXISTS”。

gets a

VALUE a 0 4 2

1234

END

cas a 0 0 4 3

2154EXISTS        ——存儲失敗

get a

VALUE a 0 4

1234

END

cas a 0 0 4 2

4321

STORED        ——存儲成功

gets a

VALUE a 0 4 6

4321

END

 

三、狀態命令

1stats  全局統計

memcached telnet命令 - 白楊 - 白楊的博客

 

 

可以計算緩存命中率

命中率=get_hits / (get_hits + get_misses)

get_hits表示命中次數

get_misses表示未命中次數

注意:這個命中率是從memcached啟動開始所有的請求的綜合值,不能反映一個時間段內的情況

 

2stats items  統計各slab class中的item的情況

memcached telnet命令 - 白楊 - 白楊的博客

 

 

執行stats items,可以看到STAT items行,如果memcached存儲內容很多,那么這里也會列出很多的STAT items行。

number 3 表示當前有3個值

age:反應了當前還在緩存的數據中最久的時間

evicted:如果一個slab的evicted屬性不是0,則說明當前slab出現了提前剔除數據的情況,這個slab可能是你需要注意的。

evicted_time:如果evicted不為0,則evicited_time就代表最后被剔除的數據時間緩存的時間。

3stats slabs  統計slabs的使用情況

 

 

chunk_size    當前slab每個chunk的大小

chunk_per_page     每個page能夠存放的chunk數

total_pages  分配給當前slab的page總數

total_chunks 當前slab最多能夠存放的chunk數,應該等於chunck_per_page * total_page

used_chunks 已經被占用的chunks總數

free_chunks  過期數據空出的chunk里還沒有被使用的chunk數

free_chunks_end     新分配的但是還沒有被使用的chunk數

 

這個命令的信息量很大,所有屬性都很有價值。下面一一解釋各屬性:

chunk_size, chunk_per_page

這兩個屬性是固定的,但是它反映當前slab存儲的數據大小,可以供你分析緩存數據的散列區間,通過調整增長因子可以改變slab的區間分布,從而改變數據散列到的區域。如果大量的230byte到260byte的數據,而剛好一個slab大小是250byte,則250byte到260byte的數據將被落到下一個slab,從而導致大量的空間浪費。

total_pages

這個是當前slab總共分配大的page總數,如果沒有修改page的默認大小的情況下,這個數值就是當前slab能夠緩存的數據的總大小(單位為M)。如果這個slab的剔除非常嚴重,一定要注意這個slab的page數是不是太少了。

我上次處理的那個項目因為和另外的一個項目共用的memcache,而且memcache已經運行了很長時間,導致page都已經全部被分配完,而剛好兩個項目的緩存數據大小差別很多,導致新項目數據最多的slab 4竟然只有一個page,所以數據緩存不到22s就被替換了,完全失去了緩存的意義。

針對我遇到的那個情況,解決方案是重新分配page,或者重啟memcache服務。但是page reassign方法從1.2.8版已經完全移除了,所以現在沒有辦法在線情況下重新分配page了。另外一種有些時候是不可以接受的,因為一次緩存服務器的重啟將導致所有緩存的數據將重新從DB取出,這個可能造成db的壓力瞬間增大。而且有的緩存數據時不入庫的,這個時候我們就需要做memcache的導入和導出了。在下篇文章中我會總結下memcache的dump操作。

total_chunks

這個的作用和total_pages基本相同,不過這個屬性可以更准確的反應實際可以存放的緩存對象總數。

used_chunks, free_chunks, free_chunks_end

這三個屬性相關度比較高,從數值上來看它們滿足:

total_chunks = used_chunks + free_chunks + free_chunks_end

used_chunks就是字面的意思,已經使用的chunk數;free_chunks卻不是所有的未被使用的chunk數,而是曾經被使用過但是因為過期而被回收的chunk數;free_chunks_end是page中從來沒有被使用過的chunk數。

 

3stats cachedump slab_id limit_num

我們執行stats cachedump 1 0 命令效果如下:

memcached telnet命令 - 白楊 - 白楊的博客

 

 

命令當中的1,即為 memcached telnet命令 - 白楊 - 白楊的博客 中的1,0表示全部取出,n表示取出n行

 

這里slab_id為1,是由2中的stats items返回的結果(STAT items后面的數字)決定的;limit_num看起來好像是返回多少條記錄,猜的一點不錯, 不過0表示顯示出所有記錄,而n(n>0)就表示顯示n條記錄,如果n超過該slab下的所有記錄,則結果和0返回的結果一致。

通過stats items、stats cachedump slab_id limit_num配合get命令可以遍歷memcached的記錄。

 

4、其他stats命令

stats slabs,stats sizes,stats reset等等使用也比較常見。

 

四、其他常見命令

1append

在現有的緩存數據后添加緩存數據,如現有緩存的key不存在服務器響應為NOT_STORED。

 

 memcached telnet命令 - 白楊 - 白楊的博客

 

2prepend

append非常類似,但它的作用是在現有的緩存數據前添加緩存數據。

 

 memcached telnet命令 - 白楊 - 白楊的博客

 

3flush_all [<delay>]

該命令有一個可選的數字參數。它總是執行成功,服務器會發送 “OK\r\n” 回應。它的效果是使已經存在的項目立即失效(缺省),或在指定的時間后。此后執行取回命令,將不會有任何內容返回(除非重新存儲同樣的鍵名)。 flush_all 實際上沒有立即釋放項目所占用的內存,而是在隨后陸續有新的項目被儲存時執行(這是由memcached的懶惰檢測和刪除機制決定的)。

這個最簡單的命令僅用於清理緩存中的所有名稱/值對。如果您需要將緩存重置到干凈的狀態,則flush_all 能提供很大的用處。

memcached telnet命令 - 白楊 - 白楊的博客

 

 

flush_all 效果是它導致所有更新時間早於 flush_all 所設定時間的項目,在被執行取回命令時命令被忽略。

 

4incr/decr

對於存儲為數字型(正值)的可以通過incr/decr命令進行增減操作。

memcached telnet命令 - 白楊 - 白楊的博客

 

 

這兩個命令是原子操作

這兩個操作的前提是這個key存在且其值是一個有效的64-bit無符號整數的十進制表示(在內部存儲時,其實是用的字符串)

decr至0后,再decr不會有效果。但incr到最大值后會溢出

原文鏈接:http://blog.163.com/suyangcs@126/blog/static/1132801932013527113121511/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM