連接
cmd下執行:
格式:telnet ip port,如下:
telnet 127.0.0.1 11211
如連接失敗,顯示
退出
quit
命令說明:
一、存儲命令
存儲命令的格式:
1 2 |
<command name> <key> <flags> <exptime> <bytes> <data block> |
參數說明如下:
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
刪除已存在的鍵值和不存在的記錄可以返回不同的結果
二、讀取命令
1、get
get命令的key可以表示一個或者多個鍵,鍵之間以空格隔開
獲取一個
get b
VALUE b 0 2
aa
END
獲取多個
get a b
VALUE a 0 4
1234
VALUE b 0 2
aa
END
2、gets
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
3、cas
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
三、狀態命令
1、stats 全局統計

可以計算緩存命中率
命中率=get_hits / (get_hits + get_misses)
get_hits表示命中次數
get_misses表示未命中次數
注意:這個命中率是從memcached啟動開始所有的請求的綜合值,不能反映一個時間段內的情況
2、stats items 統計各slab class中的item的情況

執行stats items,可以看到STAT items行,如果memcached存儲內容很多,那么這里也會列出很多的STAT items行。
number 3 表示當前有3個值
age:反應了當前還在緩存的數據中最久的時間
evicted:如果一個slab的evicted屬性不是0,則說明當前slab出現了提前剔除數據的情況,這個slab可能是你需要注意的。
evicted_time:如果evicted不為0,則evicited_time就代表最后被剔除的數據時間緩存的時間。
3、stats 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數。
3、stats cachedump slab_id limit_num
我們執行stats cachedump 1 0 命令效果如下:

命令當中的1,即為 中的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等等使用也比較常見。
四、其他常見命令
1、append
在現有的緩存數據后添加緩存數據,如現有緩存的key不存在服務器響應為NOT_STORED。
2、prepend
和append非常類似,但它的作用是在現有的緩存數據前添加緩存數據。
3、flush_all [<delay>]
該命令有一個可選的數字參數。它總是執行成功,服務器會發送 “OK\r\n” 回應。它的效果是使已經存在的項目立即失效(缺省),或在指定的時間后。此后執行取回命令,將不會有任何內容返回(除非重新存儲同樣的鍵名)。 flush_all 實際上沒有立即釋放項目所占用的內存,而是在隨后陸續有新的項目被儲存時執行(這是由memcached的懶惰檢測和刪除機制決定的)。
這個最簡單的命令僅用於清理緩存中的所有名稱/值對。如果您需要將緩存重置到干凈的狀態,則flush_all 能提供很大的用處。

flush_all 效果是它導致所有更新時間早於 flush_all 所設定時間的項目,在被執行取回命令時命令被忽略。
4、incr/decr
對於存儲為數字型(正值)的可以通過incr/decr命令進行增減操作。

這兩個命令是原子操作
這兩個操作的前提是這個key存在且其值是一個有效的64-bit無符號整數的十進制表示(在內部存儲時,其實是用的字符串)
decr至0后,再decr不會有效果。但incr到最大值后會溢出
原文鏈接:http://blog.163.com/suyangcs@126/blog/static/1132801932013527113121511/