Memcached 教程
Memcached是一個自由開源的,高性能,分布式內存對象緩存系統。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟件。現在已成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務中提高Web應用擴展性的重要因素。
Memcached是一種基于內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用或者是頁面渲染的結果。
Memcached簡潔而強大。它的簡潔設計便于快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API兼容大部分流行的開發語言。
本質上,它是一個簡潔的key-value存儲系統。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
Memcached 官網:http://memcached.org/。
特征
memcached作為高速運行的分布式緩存服務器,具有以下的特點。
協議簡單
基于libevent的事件處理
內置內存存儲方式
memcached不互相通信的分布式
支持的語言
許多語言都實現了連接memcached的客戶端,其中以Perl、PHP為主。僅僅memcached網站上列出的有:
Perl
PHP
Python
Ruby
C#
C/C++
Lua
等等
Memcached 用戶
LiveJournal
Wikipedia
Flickr
Bebo
Typepad
Yellowbot
Youtube
WordPress.com
Craigslist
Mixi
Linux Memcached 安裝
Memcached 支持許多平臺:Linux、FreeBSD、Solaris、Mac OS,也可以安裝在Windows上。
Linux系統安裝memcached,首先要先安裝libevent庫。
sudo apt-get install libevent libevent-deve? ? ? ? ? 自動下載安裝(Ubuntu/Debian)yum install libevent libevent-deve? ? ? ? ? ? ? ? ? ? ? 自動下載安裝(Redhat/Fedora/Centos)
安裝 Memcached
自動安裝
Ubuntu/Debian
sudo apt-get install memcached
Redhat/Fedora/Centos
yum install memcached
FreeBSD
portmaster databases/memcached
源代碼安裝
從其官方網站(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 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 安裝
Memcached 運行
Memcached命令的運行:
$ /usr/local/memcached/bin/memcached -h? ? ? ? ? ? ? ? ? ? ? ? ? 命令幫助
注意:如果使用自動安裝 memcached 命令位于?/usr/local/bin/memcached。
啟動選項:
-d是啟動一個守護進程;
-m是分配給Memcache使用的內存數量,單位是MB;
-u是運行Memcache的用戶;
-l是監聽的服務器IP地址,可以有多個地址;
-p是設置Memcache監聽的端口,,最好是1024以上的端口;
-c是最大運行的并發連接數,默認是1024;
-P是設置保存Memcache的pid文件。
(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
Window 下安裝 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
Memcached 連接
我們可以通過 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 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?退出
Memcached 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:在保存失敗后輸出。
Memcached 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 :在保存失敗后輸出。
Memcached 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:執行替換失敗后輸出。
Memcached 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 9memcached
STOREDget runoob
VALUE runoob 0 9memcachedENDappend runoob 0 900 5redis
STOREDget runoob
VALUE runoob 0 14memcachedredisEND
輸出
如果數據添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
NOT_STORED:該鍵在 Memcached 上不存在。
CLIENT_ERROR:執行錯誤。
Memcached 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:執行錯誤。
Memcached 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 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
Memcached 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 令牌。
Memcached delete 命令
Memcached delete 命令用于刪除已存在的 key(鍵)。
語法:
delete 命令的基本語法格式如下:
delete key [noreply]
參數說明如下:
key:鍵值 key-value 結構中的 key,用于查找緩存值。
noreply(可選): 該參數告知服務器不需要返回數據
實例
在以下實例中,我們使用 runoob 作為 key,過期時間設置為 900 秒。之后我們使用 delete 命令刪除該 key。
set runoob 0 900 9memcached
STOREDget runoob
VALUE runoob 0 9memcachedENDdelete runoob
DELETEDget runoobENDdelete runoob
NOT_FOUND
輸出
輸出信息說明:
DELETED:刪除成功。
ERROR:語法錯誤或刪除失敗。
NOT_FOUND:key 不存在。
Memcached 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 210STOREDget visitors
VALUE visitors 0 210ENDincr visitors 515get visitors
VALUE visitors 0 215END
輸出
輸出信息說明:
NOT_FOUND:key 不存在。
CLIENT_ERROR:自增值不是對象。
ERROR其他錯誤,如語法錯誤等。
decr 命令
decr 命令的基本語法格式如下:
decr key decrement_value
參數說明如下:
key:鍵值 key-value 結構中的 key,用于查找緩存值。
decrement_value: 減少的數值。
實例
set visitors 0 900 210STOREDget visitors
VALUE visitors 0 210ENDdecr visitors 55get visitors
VALUE visitors 0 15END
在以下實例中,我們使用 visitors 作為 key,初始值為 10,之后進行減 5 操作。
輸出
輸出信息說明:
NOT_FOUND:key 不存在。
CLIENT_ERROR:自增值不是對象。
ERROR其他錯誤,如語法錯誤等。
Memcached stats 命令
Memcached stats 命令用于返回統計信息例如 PID(進程號)、版本號、連接數等。
語法:
stats 命令的基本語法格式如下:
stats
實例
在以下實例中,我們使用了 stats 命令來輸出 Memcached 服務信息。
stats
STAT pid 1162STAT uptime 5022STAT time 1415208270STAT version 1.4.14STAT libevent 2.0.19-stable
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:已過期的數據條目來存儲新數據的數目
Memcached 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
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
Memcached stats sizes 命令
Memcached stats sizes 命令用于顯示所有item的大小和個數。
該信息返回兩列,第一列是 item 的大小,第二列是 item 的個數。
語法:
stats sizes 命令的基本語法格式如下:
stats sizes
實例
stats sizes
STAT 96 1
END
Memcached flush_all 命令
Memcached flush_all 命令用于用于清理緩存中的所有?key=>value(鍵=>值)?對。
該命令提供了一個可選參數?time,用于在制定的時間后執行清理緩存操作。
語法:
flush_all 命令的基本語法格式如下:
flush_all [time] [noreply]
實例
清理緩存:
set runoob 0 900 9memcached
STOREDget runoob
VALUE runoob 0 9memcachedENDflush_all
OKget runoobEND
使用Python操作memcache
Python連接memcached的庫有很多,處于簡單以及高效的原則,最終選擇了pymemcache,
優點
完全實現了memcached text協議
對于send/recv操作可以配置timeout
支持"noreply"特性,該可行可以先出的提高寫的速度
使序列化/反序列化更簡單
可以將網絡異常,memecached錯誤當成是緩存丟失
安裝pymemcache
pip install pymemcache
使用pymemcache
基本操作
[python] view plain copy
from pymemcache.client.base import Client ?
client = Client(('localhost', 11211)) ?
client.set('some_key', 'some_value') ?
result = client.get('some_key') ?
使用memcache集群
使用一致性HASH算法支持集群
[python] view plain copy
from pymemcache.client.hash import HashClient ?
client = HashClient([('127.0.0.1', 11211),('127.0.0.1', 11212)]) ?
client.set('some_key', 'some value') ?
result = client.get('some_key') ?
序列化操作
[python] view plain copy
import json ?
from pymemcache.client.base import Client ?
def json_serializer(key, value):if type(value)== str:return value
? ? ?return json.dumps(value)
def json_deserializer(key, value, flags):if flags == 1:return value ?
? ? if flags == 2:return json.loads(value)raiseException("Unknown serialization format") ?
client = Client(('localhost', 11211), serializer=json_serializer, ?
? ? ? ? ? ? ? ? deserializer=json_deserializer) ?
client.set('key',{'a':'b', 'c':'d'}) ?
result = client.get('key') ?
最佳實踐
在構造Client時,添加timeout 的配置,防止block操作
使用“noreply”來提高性能,默認情況下改屬性在“set”, “add”, “replace”, “append”, “prepend”, and “delete”.操作時是開啟的,“cas”, “incr” and “decr”.操作時關閉的
盡可能的使用get_many以及gets_many操作,來減少round trip的操作實踐
使用“ignore_exc” 屬性,將網絡異常,memecached錯誤當成是緩存丟失
主要URL:
pypi:https://pypi.python.org/pypi/pymemcache