一.memcached的簡介:
Memcached是一個自由開源的,高性能,分布式內存對象緩存系統。
Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API兼容大部分流行的開發語言。
本質上,它是一個簡潔的key-value存儲系統。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
memcached作為高速運行的分布式緩存服務器,具有以下的特點。
- 協議簡單
- 基於libevent的事件處理
- 內置內存存儲方式
- memcached不互相通信的分布式
二.memcached的安裝
1.linux下安裝memcached
(1)自動安裝
Ubuntu/Debian
sudo apt-get install memcached
Redhat/Fedora/Centos
yum install memcached
(2)源碼安裝
從其官方網站(http://memcached.org)下載memcached最新版本。
wget http://memcached.org/latest 下載最新版本 tar -zxvf memcached-1.x.x.tar.gz 解壓源碼 cd memcached-1.x.x 進入目錄 ./configure --prefix=/usr/local/memcached 配置 make && make test 編譯 sudo make install 安裝
(3)啟動
1)作為前台程序運行:
從終端輸入以下命令,啟動memcached:
/usr/local/memcached/bin/memcached -p 11211 -m 64m -vv slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 中間省略 slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp)
這里顯示了調試信息。這樣就在前台啟動了memcached,監聽TCP端口11211,最大內存使用量為64M。調試信息的內容大部分是關於存儲的信息。
2)作為后台服務程序運行:
# /usr/local/memcached/bin/memcached -p 11211 -m 64m -d
或者
/usr/local/memcached/bin/memcached -d -m 64M -u root -l 192.168.0.200 -p 11211 -c 256 -P /tmp/memcached.pid
2.windows下安裝memcached
官網上並未提供 Memcached 的Window平台安裝包,我們可以使用以下鏈接來下載,你需要根據自己的系統平台及需要的版本號點擊對應的鏈接下載即可:
- 32位系統 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin.zip
- 32位系統 1.2.6版本:http://static.runoob.com/download/memcached-1.2.6-win32-bin.zip
- 32位系統 1.4.4版本:http://static.runoob.com/download/memcached-win32-1.4.4-14.zip
- 64位系統 1.4.4版本:http://static.runoob.com/download/memcached-win64-1.4.4-14.zip
- 32位系統 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-x86.zip
- 64位系統 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-amd64.zip
在 1.4.5 版本以前 memcached 可以作為一個服務安裝,而在 1.4.5 及之后的版本刪除了該功能。因此我們以下介紹兩個不同版本 1.4.4 及 1.4.5的不同安裝方法:
memcached <1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 1.4.5 版本以前 memcached 可以作為一個服務安裝,使用管理員權限運行以下命令:
c:\memcached\memcached.exe -d install
注意:你需要使用真實的路徑替代 c:\memcached\memcached.exe。
3、然后我們可以使用以下命令來啟動和關閉 memcached 服務:
c:\memcached\memcached.exe -d start c:\memcached\memcached.exe -d stop
4、如果要修改 memcached 的配置項, 可以在命令行中執行 regedit.exe 命令打開注冊表並找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 來進行修改。
如果要提供 memcached 使用的緩存配置 可以修改 ImagePath 為:
"c:\memcached\memcached.exe" -d runservice -m 512
-m 512 意思是設置 memcached 最大的緩存配置為512M。
此外我們還可以通過使用 "c:\memcached\memcached.exe -h" 命令查看更多的參數配置。
5、如果我們需要卸載 memcached ,可以使用以下命令:
c:\memcached\memcached.exe -d uninstall
memcached >= 1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 memcached1.4.5 版本之后,memcached 不能作為服務來運行,需要使用任務計划中來開啟一個普通的進程,在 window 啟動時設置 memcached自動執行。
我們使用管理員身份執行以下命令將 memcached 添加來任務計划表中:
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
注意:你需要使用真實的路徑替代 c:\memcached\memcached.exe。
注意:-m 512 意思是設置 memcached 最大的緩存配置為512M。
注意:我們可以通過使用 "c:\memcached\memcached.exe -h" 命令查看更多的參數配置。
3、如果需要刪除 memcached 的任務計划可以執行以下命令:
schtasks /delete /tn memcached
三.啟動和使用memcache
(1)連接
我們可以通過 telnet 命令並指定主機ip和端口來連接 Memcached 服務。
語法
telnet HOST PORT
命令中的 HOST 和 PORT 為運行 Memcached 服務的 IP 和 端口。
實例
以下實例演示了如何連接到 Memcached 服務並執行簡單的 set 和 get 命令。
本實例的 Memcached 服務運行的主機為 127.0.0.1(本機) 、端口為 11211。
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 保存命令 bar 數據 STORED 結果 get foo 取得命令 VALUE foo 0 3 數據 bar 數據 END 結束行 quit 退出
(2)memcache的使用:
Memcached 存儲命令
1)set命令
Memcached set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。
如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。
語法:
set 命令的基本語法格式如下:
set key flags exptime bytes [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
以下實例中我們設置:
- key → runoob
- flag → 0
- exptime → 900 (以秒為單位)
- bytes → 9 (數據存儲的字節數)
- value → memcached
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END
輸出
如果數據設置成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- ERROR:在保持失敗后輸出。
2)add命令
Memcached add 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。
如果 add 的 key 已經存在,則不會更新數據(過期的 key 會更新),之前的值將仍然保持相同,並且您將獲得響應NOT_STORED。
語法:
add 命令的基本語法格式如下:
add key flags exptime bytes [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
以下實例中我們設置:
- key → new_key
- flag → 0
- exptime → 900 (以秒為單位)
- bytes → 10 (數據存儲的字節數)
- value → data_value
add new_key 0 900 10 data_value STORED get new_key VALUE new_key 0 10 data_value END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- NOT_STORED :在保持失敗后輸出。
3)replace命令
Memcached replace 命令用於替換已存在的 key(鍵) 的 value(數據值)。
如果 key 不存在,則替換失敗,並且您將獲得響應 NOT_STORED。
語法:
replace 命令的基本語法格式如下:
replace key flags exptime bytes [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
以下實例中我們設置:
- key → mykey
- flag → 0
- exptime → 900 (以秒為單位)
- bytes → 10 (數據存儲的字節數)
- value → data_value
以下實例中我們使用的鍵位 'mykey' 並存儲對應的值 data_value。執行后我們替換相同的 key 的值為 'some_other_value'。
add mykey 0 900 10 data_value STORED get mykey VALUE mykey 0 10 data_value END replace mykey 0 900 16 some_other_value get mykey VALUE mykey 0 16 some_other_value END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- NOT_STORED:執行替換失敗后輸出。
4)append命令
Memcached append 命令用於向已存在 key(鍵) 的 value(數據值) 后面追加數據 。
語法:
append 命令的基本語法格式如下:
append key flags exptime bytes [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
實例如下:
- 首先我們在 Memcached 中存儲一個鍵 runoob,其值為 memcached。
- 然后,我們使用 get 命令檢索該值。
- 然后,我們使用 append 命令在鍵為 runoob 的值后面追加 "redis"。
- 最后,我們再使用 get 命令檢索該值。
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END append runoob 0 900 5 redis STORED get runoob VALUE runoob 0 14 memcachedredis END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- NOT_STORED:該鍵在 Memcached 上不存在。
- CLIENT_ERROR:執行錯誤。
5)prepend命令:
Memcached prepend 命令用於向已存在 key(鍵) 的 value(數據值) 前面追加數據 。
語法:
prepend 命令的基本語法格式如下:
prepend key flags exptime bytes [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
實例如下:
- 首先我們在 Memcached 中存儲一個鍵 runoob,其值為 memcached。
- 然后,我們使用 get 命令檢索該值。
- 然后,我們使用 prepend 命令在鍵為 runoob 的值后面追加 "redis"。
- 最后,我們再使用 get 命令檢索該值。
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END prepend runoob 0 900 5 redis STORED get runoob VALUE runoob 0 14 redismemcached END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- NOT_STORED:該鍵在 Memcached 上不存在。
- CLIENT_ERROR:執行錯誤。
6)CAS命令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用於執行一個"檢查並設置"的操作
它僅在當前客戶端最后一次取值后,該key 對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。
檢查是通過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個唯一的64位值。
語法:
CAS 命令的基本語法格式如下:
cas key flags exptime bytes unique_cas_token [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- unique_cas_token通過 gets 命令獲取的一個唯一的64位值。
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
要在 Memcached 上使用 CAS 命令,你需要從 Memcached 服務商通過 gets 命令獲取令牌(token)。
gets 命令的功能類似於基本的 get 命令。兩個命令之間的差異在於,gets 返回的信息稍微多一些:64 位的整型值非常像名稱/值對的 "版本" 標識符。
實例步驟如下:
- 如果沒有設置唯一令牌,則 CAS 命令執行錯誤。
- 如果鍵 key 不存在,執行失敗。
- 添加鍵值對。
- 通過 gets 命令獲取唯一令牌。
- 使用 cas 命令更新數據
- 使用 get 命令查看數據是否更新
cas tp 0 900 9 ERROR <− 缺少 token cas tp 0 900 9 2 memcached NOT_FOUND <− 鍵 tp 不存在 set tp 0 900 9 memcached STORED gets tp VALUE tp 0 9 1 memcached END cas tp 0 900 5 1 redis STORED get tp VALUE tp 0 5 redis END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- ERROR:保存出錯或語法錯誤。
- EXISTS:在最后一次取值后另外一個用戶也在更新該數據。
- NOT_FOUND:Memcached 服務上不存在該鍵值。
7)CAS命令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用於執行一個"檢查並設置"的操作
它僅在當前客戶端最后一次取值后,該key 對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。
檢查是通過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個唯一的64位值。
語法:
CAS 命令的基本語法格式如下:
cas key flags exptime bytes unique_cas_token [noreply] value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
- exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
- bytes:在緩存中存儲的字節數
- unique_cas_token通過 gets 命令獲取的一個唯一的64位值。
- noreply(可選): 該參數告知服務器不需要返回數據
- value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)
實例
要在 Memcached 上使用 CAS 命令,你需要從 Memcached 服務商通過 gets 命令獲取令牌(token)。
gets 命令的功能類似於基本的 get 命令。兩個命令之間的差異在於,gets 返回的信息稍微多一些:64 位的整型值非常像名稱/值對的 "版本" 標識符。
實例步驟如下:
- 如果沒有設置唯一令牌,則 CAS 命令執行錯誤。
- 如果鍵 key 不存在,執行失敗。
- 添加鍵值對。
- 通過 gets 命令獲取唯一令牌。
- 使用 cas 命令更新數據
- 使用 get 命令查看數據是否更新
cas tp 0 900 9 ERROR <− 缺少 token cas tp 0 900 9 2 memcached NOT_FOUND <− 鍵 tp 不存在 set tp 0 900 9 memcached STORED gets tp VALUE tp 0 9 1 memcached END cas tp 0 900 5 1 redis STORED get tp VALUE tp 0 5 redis END
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
- STORED:保存成功后輸出。
- ERROR:保存出錯或語法錯誤。
- EXISTS:在最后一次取值后另外一個用戶也在更新該數據。
- NOT_FOUND:Memcached 服務上不存在該鍵值。
Memcached 查找命令
1)get命令
Memcached get 命令獲取存儲在 key(鍵) 中的 value(數據值) ,如果 key 不存在,則返回空。
語法:
get 命令的基本語法格式如下:
get key
多個 key 使用空格隔開,如下:
get key1 key2 key3
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
實例
在以下實例中,我們使用 runoob 作為 key,過期時間設置為 900 秒。
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END
2)gets命令
Memcached gets 命令獲取帶有 CAS 令牌存 的 value(數據值) ,如果 key 不存在,則返回空。
語法:
gets 命令的基本語法格式如下:
gets key
多個 key 使用空格隔開,如下:
gets key1 key2 key3
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
實例
在以下實例中,我們使用 runoob 作為 key,過期時間設置為 900 秒。
set runoob 0 900 9 memcached STORED gets runoob VALUE runoob 0 9 1 memcached END
在 使用 gets 命令的輸出結果中,在最后一列的數字 1 代表了 key 為 runoob 的 CAS 令牌。
3)detete命令
Memcached delete 命令用於刪除已存在的 key(鍵)。
語法:
delete 命令的基本語法格式如下:
delete key [noreply]
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- noreply(可選): 該參數告知服務器不需要返回數據
實例
在以下實例中,我們使用 runoob 作為 key,過期時間設置為 900 秒。之后我們使用 delete 命令刪除該 key。
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END delete runoob DELETED get runoob END delete runoob NOT_FOUND
輸出
輸出信息說明:
- DELETED:刪除成功。
- ERROR:語法錯誤或刪除失敗。
- NOT_FOUND:key 不存在。
4)incr 與 decr 命令
Memcached incr 與 decr 命令用於對已存在的 key(鍵) 的數字值進行自增或自減操作。
incr 與 decr 命令操作的數據必須是十進制的32位無符號整數。
如果 key 不存在返回 NOT_FOUND,如果鍵的值不為數字,則返回 CLIENT_ERROR,其他錯誤返回 ERROR。
incr 命令
語法:
incr 命令的基本語法格式如下:
incr key increment_value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- increment_value: 增加的數值。
實例
在以下實例中,我們使用 visitors 作為 key,初始值為 10,之后進行加 5 操作。
set visitors 0 900 2 10 STORED get visitors VALUE visitors 0 2 10 END incr visitors 5 15 get visitors VALUE visitors 0 2 15 END
輸出
輸出信息說明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是對象。
- ERROR其他錯誤,如語法錯誤等。
decr 命令
decr 命令的基本語法格式如下:
decr key decrement_value
參數說明如下:
- key:鍵值 key-value 結構中的 key,用於查找緩存值。
- decrement_value: 減少的數值。
實例
set visitors 0 900 2 10 STORED get visitors VALUE visitors 0 2 10 END decr visitors 5 5 get visitors VALUE visitors 0 1 5 END
在以下實例中,我們使用 visitors 作為 key,初始值為 10,之后進行減 5 操作。
輸出
輸出信息說明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是對象。
- ERROR其他錯誤,如語法錯誤等。
Memcached 統計命令
1)stats命令
Memcached stats 命令用於返回統計信息例如 PID(進程號)、版本號、連接數等。
語法:
stats 命令的基本語法格式如下:
stats
實例
在以下實例中,我們使用了 stats 命令來輸出 Memcached 服務信息。
stats STAT pid 1162 STAT uptime 5022 STAT time 1415208270 STAT version 1.4.14 STAT libevent 2.0.19-stable STAT pointer_size 64 STAT rusage_user 0.096006 STAT rusage_system 0.152009 STAT curr_connections 5 STAT total_connections 6 STAT connection_structures 6 STAT reserved_fds 20 STAT cmd_get 6 STAT cmd_set 4 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 4 STAT get_misses 2 STAT delete_misses 1 STAT delete_hits 1 STAT incr_misses 2 STAT incr_hits 1 STAT decr_misses 0 STAT decr_hits 1 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 262 STAT bytes_written 313 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT expired_unfetched 1 STAT evicted_unfetched 0 STAT bytes 142 STAT curr_items 2 STAT total_items 6 STAT evictions 0 STAT reclaimed 1 END
這里顯示了很多狀態信息,下邊詳細解釋每個狀態項:
- pid: memcache服務器進程ID
- uptime:服務器已運行秒數
- time:服務器當前Unix時間戳
- version:memcache版本
- pointer_size:操作系統指針大小
- rusage_user:進程累計用戶時間
- rusage_system:進程累計系統時間
- curr_connections:當前連接數量
- total_connections:Memcached運行以來連接總數
- connection_structures:Memcached分配的連接結構數量
- cmd_get:get命令請求次數
- cmd_set:set命令請求次數
- cmd_flush:flush命令請求次數
- get_hits:get命令命中次數
- get_misses:get命令未命中次數
- delete_misses:delete命令未命中次數
- delete_hits:delete命令命中次數
- incr_misses:incr命令未命中次數
- incr_hits:incr命令命中次數
- decr_misses:decr命令未命中次數
- decr_hits:decr命令命中次數
- cas_misses:cas命令未命中次數
- cas_hits:cas命令命中次數
- cas_badval:使用擦拭次數
- auth_cmds:認證命令處理的次數
- auth_errors:認證失敗數目
- bytes_read:讀取總字節數
- bytes_written:發送總字節數
- limit_maxbytes:分配的內存總大小(字節)
- accepting_conns:服務器是否達到過最大連接(0/1)
- listen_disabled_num:失效的監聽數
- threads:當前線程數
- conn_yields:連接操作主動放棄數目
- bytes:當前存儲占用的字節數
- curr_items:當前存儲的數據總數
- total_items:啟動以來存儲的數據總數
- evictions:LRU釋放的對象數目
- reclaimed:已過期的數據條目來存儲新數據的數目
2)stats items 命令
Memcached stats items 命令用於顯示各個 slab 中 item 的數目和存儲時長(最后一次訪問距離現在的秒數)。
語法:
stats items 命令的基本語法格式如下:
stats items
實例
stats items STAT items:1:number 1 STAT items:1:age 7 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 END
3)Memcached stats slabs 命令
Memcached stats slabs 命令用於顯示各個slab的信息,包括chunk的大小、數目、使用情況等。
語法:
stats slabs 命令的基本語法格式如下:
stats slabs
實例
stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 STAT 1:total_chunks 10922 STAT 1:used_chunks 1 STAT 1:free_chunks 10921 STAT 1:free_chunks_end 0 STAT 1:mem_requested 71 STAT 1:get_hits 0 STAT 1:cmd_set 1 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 0 STAT 1:cas_badval 0 STAT 1:touch_hits 0 STAT active_slabs 1 STAT total_malloced 1048512 END
4)Memcached stats sizes 命令
Memcached stats sizes 命令用於顯示所有item的大小和個數。
該信息返回兩列,第一列是 item 的大小,第二列是 item 的個數。
語法:
stats sizes 命令的基本語法格式如下:
stats sizes
實例
stats sizes STAT 96 1 END
5)Memcached flush_all 命令
Memcached flush_all 命令用於用於清理緩存中的所有 key=>value(鍵=>值) 對。
該命令提供了一個可選參數 time,用於在制定的時間后執行清理緩存操作。
語法:
flush_all 命令的基本語法格式如下:
flush_all [time] [noreply]
實例
清理緩存:
set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached END flush_all OK get runoob END
四。java連接Memcached
使用 Java 程序連接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。
本站 jar 包下載地址:spymemcached-2.10.3.jar。
Google Code jar 包下載地址:spymemcached-2.10.3.jar(需要翻牆)。
以下程序假定 Memcached 服務的主機為 127.0.0.1,端口為 11211。
連接實例
Java 連接 Memcached
import net.spy.memcached.MemcachedClient; import java.net.*; public class MemcachedJava { public static void main(String[] args) { try{ // 本地連接 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 關閉連接 mcc.shutdown(); }catch(Exception ex){ System.out.println( ex.getMessage() ); } } }
該程序中我們使用 InetSocketAddress 連接 IP 為 127.0.0.1 端口 為 11211 的 memcached 服務。
執行以上代碼,如果連接成功會輸出以下信息:
Connection to server successful.
set 操作實例
以下使用 java.util.concurrent.Future 來存儲數據
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 存儲數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 查看存儲狀態 System.out.println("set status:" + fo.get()); // 輸出值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 關閉連接 mcc.shutdown(); }catch(Exception ex){ System.out.println( ex.getMessage() ); } } }
執行程序,輸出結果為:
Connection to server successful. set status:true runoob value in cache - Free Education
add 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 打印狀態 System.out.println("set status:" + fo.get()); // 輸出 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 添加 Future fo = mcc.add("runoob", 900, "memcached"); // 打印狀態 System.out.println("add status:" + fo.get()); // 添加新key fo = mcc.add("codingground", 900, "All Free Compilers"); // 打印狀態 System.out.println("add status:" + fo.get()); // 輸出 System.out.println("codingground value in cache - " + mcc.get("codingground")); // 關閉連接 mcc.shutdown(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } }
replace 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try { //連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加第一個 key=》value 對 Future fo = mcc.set("runoob", 900, "Free Education"); // 輸出執行 add 方法后的狀態 System.out.println("add status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 添加新的 key fo = mcc.replace("runoob", 900, "Largest Tutorials' Library"); // 輸出執行 set 方法后的狀態 System.out.println("replace status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 關閉連接 mcc.shutdown(); }catch(Exception ex){ System.out.println( ex.getMessage() ); } } }
append 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 對存在的key進行數據添加操作 Future fo = mcc.append("runoob", 900, " for All"); // 輸出執行 set 方法后的狀態 System.out.println("append status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("codingground")); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
prepend 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Education for All"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 對存在的key進行數據添加操作 Future fo = mcc.prepend("runoob", 900, "Free "); // 輸出執行 set 方法后的狀態 System.out.println("prepend status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("codingground")); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
CAS 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.CASValue; import net.spy.memcached.CASResponse; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 使用 get 方法獲取數據 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 通過 gets 方法獲取 CAS token(令牌) CASValue casValue = mcc.gets("runoob"); // 輸出 CAS token(令牌) 值 System.out.println("CAS token - " + casValue); // 嘗試使用cas方法來更新數據 CASResponse casresp = mcc.cas("runoob", casValue.getCas(), 900, "Largest Tutorials-Library"); // 輸出 CAS 響應信息 System.out.println("CAS Response - " + casresp); // 輸出值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
get 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 使用 get 方法獲取數據 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
gets 操作實例、CAS
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.CASValue; import net.spy.memcached.CASResponse; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "Free Education"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 從緩存中獲取鍵為 runoob 的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 通過 gets 方法獲取 CAS token(令牌) CASValue casValue = mcc.gets("runoob"); // 輸出 CAS token(令牌) 值 System.out.println("CAS value in cache - " + casValue); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
delete 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數據 Future fo = mcc.set("runoob", 900, "World's largest online tutorials library"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("runoob")); // 對存在的key進行數據添加操作 Future fo = mcc.delete("runoob"); // 輸出執行 delete 方法后的狀態 System.out.println("delete status:" + fo.get()); // 獲取鍵對應的值 System.out.println("runoob value in cache - " + mcc.get("codingground")); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }
Incr/Decr 操作實例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class MemcachedJava { public static void main(String[] args) { try{ // 連接本地的 Memcached 服務 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful."); // 添加數字值 Future fo = mcc.set("number", 900, "1000"); // 輸出執行 set 方法后的狀態 System.out.println("set status:" + fo.get()); // 獲取鍵對應的值 System.out.println("value in cache - " + mcc.get("number")); // 自增並輸出 System.out.println("value in cache after increment - " + mcc.incr("number", 111)); // 自減並輸出 System.out.println("value in cache after decrement - " + mcc.decr("number", 112)); // 關閉連接 mcc.shutdown(); }catch(Exception ex) System.out.println(ex.getMessage()); } }