Memcached 教程
Memcached是一個(gè)自由開源的,高性能,分布式內(nèi)存對象緩存系統(tǒng)。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發(fā)的一款軟件。現(xiàn)在已成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務(wù)中提高Web應(yīng)用擴(kuò)展性的重要因素。
Memcached是一種基于內(nèi)存的key-value存儲(chǔ),用來存儲(chǔ)小塊的任意數(shù)據(jù)(字符串、對象)。這些數(shù)據(jù)可以是數(shù)據(jù)庫調(diào)用、API調(diào)用或者是頁面渲染的結(jié)果。
Memcached簡潔而強(qiáng)大。它的簡潔設(shè)計(jì)便于快速開發(fā),減輕開發(fā)難度,解決了大數(shù)據(jù)量緩存的很多問題。它的API兼容大部分流行的開發(fā)語言。
本質(zhì)上,它是一個(gè)簡潔的key-value存儲(chǔ)系統(tǒng)。
一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。

Memcached 官網(wǎng):http://memcached.org/。
特征
memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn)。
協(xié)議簡單
基于libevent的事件處理
內(nèi)置內(nèi)存存儲(chǔ)方式
memcached不互相通信的分布式
支持的語言
許多語言都實(shí)現(xiàn)了連接memcached的客戶端,其中以Perl、PHP為主。僅僅memcached網(wǎng)站上列出的有:
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系統(tǒng)安裝memcached,首先要先安裝libevent庫。
sudo apt-get install libevent libevent-deve? ? ? ? ? 自動(dòng)下載安裝(Ubuntu/Debian)yum install libevent libevent-deve? ? ? ? ? ? ? ? ? ? ? 自動(dòng)下載安裝(Redhat/Fedora/Centos)
安裝 Memcached
自動(dòng)安裝
Ubuntu/Debian
sudo apt-get install memcached
Redhat/Fedora/Centos
yum install memcached
FreeBSD
portmaster databases/memcached
源代碼安裝
從其官方網(wǎng)站(http://memcached.org)下載memcached最新版本。
wget http://memcached.org/latest ? ? ? ? ? ? ? ? ? ?下載最新版本
tar -zxvf memcached-1.x.x.tar.gz ? ? ? ? ? ? ? ? ? ?解壓源碼
cd memcached-1.x.x ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?進(jìn)入目錄
./configure --prefix=/usr/local/memcached ? ? ? ? ? 配置
make && make test ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 編譯
sudo make install ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 安裝
Memcached 運(yùn)行
Memcached命令的運(yùn)行:
$ /usr/local/memcached/bin/memcached -h? ? ? ? ? ? ? ? ? ? ? ? ? 命令幫助
注意:如果使用自動(dòng)安裝 memcached 命令位于?/usr/local/bin/memcached。
啟動(dòng)選項(xiàng):
-d是啟動(dòng)一個(gè)守護(hù)進(jìn)程;
-m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB;
-u是運(yùn)行Memcache的用戶;
-l是監(jiān)聽的服務(wù)器IP地址,可以有多個(gè)地址;
-p是設(shè)置Memcache監(jiān)聽的端口,,最好是1024以上的端口;
-c是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024;
-P是設(shè)置保存Memcache的pid文件。
(1)作為前臺程序運(yùn)行:
從終端輸入以下命令,啟動(dòng)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)
這里顯示了調(diào)試信息。這樣就在前臺啟動(dòng)了memcached,監(jiān)聽TCP端口11211,最大內(nèi)存使用量為64M。調(diào)試信息的內(nèi)容大部分是關(guān)于存儲(chǔ)的信息。
(2)作為后臺服務(wù)程序運(yùn)行:
# /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
官網(wǎng)上并未提供 Memcached 的Window平臺安裝包,我們可以使用以下鏈接來下載,你需要根據(jù)自己的系統(tǒng)平臺及需要的版本號點(diǎn)擊對應(yīng)的鏈接下載即可:
32位系統(tǒng) 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin.zip
32位系統(tǒng) 1.2.6版本:http://static.runoob.com/download/memcached-1.2.6-win32-bin.zip
32位系統(tǒng) 1.4.4版本:http://static.runoob.com/download/memcached-win32-1.4.4-14.zip
64位系統(tǒng) 1.4.4版本:http://static.runoob.com/download/memcached-win64-1.4.4-14.zip
32位系統(tǒng) 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-x86.zip
64位系統(tǒng) 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-amd64.zip
在 1.4.5 版本以前 memcached 可以作為一個(gè)服務(wù)安裝,而在 1.4.5 及之后的版本刪除了該功能。因此我們以下介紹兩個(gè)不同版本 1.4.4 及 1.4.5的不同安裝方法:
memcached <1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 1.4.5 版本以前 memcached 可以作為一個(gè)服務(wù)安裝,使用管理員權(quán)限運(yùn)行以下命令:
c:\memcached\memcached.exe -d install
注意:你需要使用真實(shí)的路徑替代 c:\memcached\memcached.exe。
3、然后我們可以使用以下命令來啟動(dòng)和關(guān)閉 memcached 服務(wù):
c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop
4、如果要修改 memcached 的配置項(xiàng), 可以在命令行中執(zhí)行 regedit.exe 命令打開注冊表并找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 來進(jìn)行修改。
如果要提供 memcached 使用的緩存配置 可以修改 ImagePath 為:
"c:\memcached\memcached.exe" -d runservice -m 512
-m 512 意思是設(shè)置 memcached 最大的緩存配置為512M。
此外我們還可以通過使用 "c:\memcached\memcached.exe -h" 命令查看更多的參數(shù)配置。
5、如果我們需要卸載 memcached ,可以使用以下命令:
c:\memcached\memcached.exe -d uninstall
memcached >= 1.4.5 版本安裝
1、解壓下載的安裝包到指定目錄。
2、在 memcached1.4.5 版本之后,memcached 不能作為服務(wù)來運(yùn)行,需要使用任務(wù)計(jì)劃中來開啟一個(gè)普通的進(jìn)程,在 window 啟動(dòng)時(shí)設(shè)置 memcached自動(dòng)執(zhí)行。
我們使用管理員身份執(zhí)行以下命令將 memcached 添加來任務(wù)計(jì)劃表中:
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
注意:你需要使用真實(shí)的路徑替代 c:\memcached\memcached.exe。
注意:-m 512 意思是設(shè)置 memcached 最大的緩存配置為512M。
注意:我們可以通過使用 "c:\memcached\memcached.exe -h" 命令查看更多的參數(shù)配置。
3、如果需要?jiǎng)h除 memcached 的任務(wù)計(jì)劃可以執(zhí)行以下命令:
schtasks /delete /tn memcached
Memcached 連接
我們可以通過 telnet 命令并指定主機(jī)ip和端口來連接 Memcached 服務(wù)。
語法
telnet HOST PORT
命令中的 HOST 和 PORT 為運(yùn)行 Memcached 服務(wù)的 IP 和 端口。
實(shí)例
以下實(shí)例演示了如何連接到 Memcached 服務(wù)并執(zhí)行簡單的 set 和 get 命令。
本實(shí)例的 Memcached 服務(wù)運(yùn)行的主機(jī)為 127.0.0.1(本機(jī)) 、端口為 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 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)據(jù)
STORED ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?結(jié)果
get foo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 取得命令
VALUE foo 0 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)據(jù)
bar ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)據(jù)
END ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 結(jié)束行
quit ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?退出
Memcached set 命令
Memcached set 命令用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果set的key已經(jīng)存在,該命令可以更新該key所對應(yīng)的原來的數(shù)據(jù),也就是實(shí)現(xiàn)更新的作用。
語法:
set 命令的基本語法格式如下:
set key flags exptime bytes [noreply]?
value?
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
以下實(shí)例中我們設(shè)置:
key → runoob
flag → 0
exptime → 900 (以秒為單位)
bytes → 9 (數(shù)據(jù)存儲(chǔ)的字節(jié)數(shù))
value → memcached
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
輸出
如果數(shù)據(jù)設(shè)置成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
ERROR:在保存失敗后輸出。
Memcached add 命令
Memcached add 命令用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果 add 的 key 已經(jīng)存在,則不會(huì)更新數(shù)據(jù)(過期的 key 會(huì)更新),之前的值將仍然保持相同,并且您將獲得響應(yīng) NOT_STORED。
語法:
add 命令的基本語法格式如下:
add key flags exptime bytes [noreply]
value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
以下實(shí)例中我們設(shè)置:
key → new_key
flag → 0
exptime → 900 (以秒為單位)
bytes → 10 (數(shù)據(jù)存儲(chǔ)的字節(jié)數(shù))
value → data_value
add new_key 0 900 10
data_value
STORED
get new_key
VALUE new_key 0 10
data_value
END
輸出
如果數(shù)據(jù)添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
NOT_STORED :在保存失敗后輸出。
Memcached replace 命令
Memcached replace 命令用于替換已存在的 key(鍵) 的 value(數(shù)據(jù)值)。
如果 key 不存在,則替換失敗,并且您將獲得響應(yīng) NOT_STORED。
語法:
replace 命令的基本語法格式如下:
replace key flags exptime bytes [noreply]
value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
以下實(shí)例中我們設(shè)置:
key → mykey
flag → 0
exptime → 900 (以秒為單位)
bytes → 10 (數(shù)據(jù)存儲(chǔ)的字節(jié)數(shù))
value → data_value
以下實(shí)例中我們使用的鍵位 'mykey' 并存儲(chǔ)對應(yīng)的值 data_value。執(zhí)行后我們替換相同的 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
輸出
如果數(shù)據(jù)添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
NOT_STORED:執(zhí)行替換失敗后輸出。
Memcached append 命令
Memcached append 命令用于向已存在?key(鍵)?的?value(數(shù)據(jù)值)?后面追加數(shù)據(jù) 。
語法:
append 命令的基本語法格式如下:
append key flags exptime bytes [noreply]value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
實(shí)例如下:
首先我們在 Memcached 中存儲(chǔ)一個(gè)鍵 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
輸出
如果數(shù)據(jù)添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
NOT_STORED:該鍵在 Memcached 上不存在。
CLIENT_ERROR:執(zhí)行錯(cuò)誤。
Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(鍵) 的 value(數(shù)據(jù)值) 前面追加數(shù)據(jù) 。
語法:
prepend 命令的基本語法格式如下:
prepend key flags exptime bytes [noreply]
value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
實(shí)例如下:
首先我們在 Memcached 中存儲(chǔ)一個(gè)鍵 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
輸出
如果數(shù)據(jù)添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
NOT_STORED:該鍵在 Memcached 上不存在。
CLIENT_ERROR:執(zhí)行錯(cuò)誤。
Memcached CAS 命令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于執(zhí)行一個(gè)"檢查并設(shè)置"的操作
它僅在當(dāng)前客戶端最后一次取值后,該key 對應(yīng)的值沒有被其他客戶端修改的情況下, 才能夠?qū)⒅祵懭搿?/p>
檢查是通過cas_token參數(shù)進(jìn)行的, 這個(gè)參數(shù)是Memcach指定給已經(jīng)存在的元素的一個(gè)唯一的64位值。
語法:
CAS 命令的基本語法格式如下:
cas key flags exptime bytes unique_cas_token [noreply]
value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時(shí)間長度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
unique_cas_token通過 gets 命令獲取的一個(gè)唯一的64位值。
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
實(shí)例
要在 Memcached 上使用 CAS 命令,你需要從 Memcached 服務(wù)商通過 gets 命令獲取令牌(token)。
gets 命令的功能類似于基本的 get 命令。兩個(gè)命令之間的差異在于,gets 返回的信息稍微多一些:64 位的整型值非常像名稱/值對的 "版本" 標(biāo)識符。
實(shí)例步驟如下:
如果沒有設(shè)置唯一令牌,則 CAS 命令執(zhí)行錯(cuò)誤。
如果鍵 key 不存在,執(zhí)行失敗。
添加鍵值對。
通過 gets 命令獲取唯一令牌。
使用 cas 命令更新數(shù)據(jù)
使用 get 命令查看數(shù)據(jù)是否更新
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
輸出
如果數(shù)據(jù)添加成功,則輸出:
STORED
輸出信息說明:
STORED:保存成功后輸出。
ERROR:保存出錯(cuò)或語法錯(cuò)誤。
EXISTS:在最后一次取值后另外一個(gè)用戶也在更新該數(shù)據(jù)。
NOT_FOUND:Memcached 服務(wù)上不存在該鍵值。
Memcached get 命令
Memcached get 命令獲取存儲(chǔ)在 key(鍵) 中的 value(數(shù)據(jù)值) ,如果 key 不存在,則返回空。
語法:
get 命令的基本語法格式如下:
get key
多個(gè) key 使用空格隔開,如下:
get key1 key2 key3
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
實(shí)例
在以下實(shí)例中,我們使用 runoob 作為 key,過期時(shí)間設(shè)置為 900 秒。
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
Memcached gets 命令
Memcached gets 命令獲取帶有 CAS 令牌存 的 value(數(shù)據(jù)值) ,如果 key 不存在,則返回空。
語法:
gets 命令的基本語法格式如下:
gets key
多個(gè) key 使用空格隔開,如下:
gets key1 key2 key3
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
實(shí)例
在以下實(shí)例中,我們使用 runoob 作為 key,過期時(shí)間設(shè)置為 900 秒。
set runoob 0 900 9
memcached
STORED
gets runoob
VALUE runoob 0 9 1
memcached
END
在 使用 gets 命令的輸出結(jié)果中,在最后一列的數(shù)字 1 代表了 key 為 runoob 的 CAS 令牌。
Memcached delete 命令
Memcached delete 命令用于刪除已存在的 key(鍵)。
語法:
delete 命令的基本語法格式如下:
delete key [noreply]
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
實(shí)例
在以下實(shí)例中,我們使用 runoob 作為 key,過期時(shí)間設(shè)置為 900 秒。之后我們使用 delete 命令刪除該 key。
set runoob 0 900 9memcached
STOREDget runoob
VALUE runoob 0 9memcachedENDdelete runoob
DELETEDget runoobENDdelete runoob
NOT_FOUND
輸出
輸出信息說明:
DELETED:刪除成功。
ERROR:語法錯(cuò)誤或刪除失敗。
NOT_FOUND:key 不存在。
Memcached incr 與 decr 命令
Memcached incr 與 decr 命令用于對已存在的 key(鍵) 的數(shù)字值進(jìn)行自增或自減操作。
incr 與 decr 命令操作的數(shù)據(jù)必須是十進(jìn)制的32位無符號整數(shù)。
如果 key 不存在返回?NOT_FOUND,如果鍵的值不為數(shù)字,則返回?CLIENT_ERROR,其他錯(cuò)誤返回?ERROR。
incr 命令
語法:
incr 命令的基本語法格式如下:
incr key increment_value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
increment_value: 增加的數(shù)值。
實(shí)例
在以下實(shí)例中,我們使用 visitors 作為 key,初始值為 10,之后進(jìn)行加 5 操作。
set visitors 0 900 210STOREDget visitors
VALUE visitors 0 210ENDincr visitors 515get visitors
VALUE visitors 0 215END
輸出
輸出信息說明:
NOT_FOUND:key 不存在。
CLIENT_ERROR:自增值不是對象。
ERROR其他錯(cuò)誤,如語法錯(cuò)誤等。
decr 命令
decr 命令的基本語法格式如下:
decr key decrement_value
參數(shù)說明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
decrement_value: 減少的數(shù)值。
實(shí)例
set visitors 0 900 210STOREDget visitors
VALUE visitors 0 210ENDdecr visitors 55get visitors
VALUE visitors 0 15END
在以下實(shí)例中,我們使用 visitors 作為 key,初始值為 10,之后進(jìn)行減 5 操作。
輸出
輸出信息說明:
NOT_FOUND:key 不存在。
CLIENT_ERROR:自增值不是對象。
ERROR其他錯(cuò)誤,如語法錯(cuò)誤等。
Memcached stats 命令
Memcached stats 命令用于返回統(tǒng)計(jì)信息例如 PID(進(jìn)程號)、版本號、連接數(shù)等。
語法:
stats 命令的基本語法格式如下:
stats
實(shí)例
在以下實(shí)例中,我們使用了 stats 命令來輸出 Memcached 服務(wù)信息。
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
這里顯示了很多狀態(tài)信息,下邊詳細(xì)解釋每個(gè)狀態(tài)項(xiàng):
pid:memcache服務(wù)器進(jìn)程ID
uptime:服務(wù)器已運(yùn)行秒數(shù)
time:服務(wù)器當(dāng)前Unix時(shí)間戳
version:memcache版本
pointer_size:操作系統(tǒng)指針大小
rusage_user:進(jìn)程累計(jì)用戶時(shí)間
rusage_system:進(jìn)程累計(jì)系統(tǒng)時(shí)間
curr_connections:當(dāng)前連接數(shù)量
total_connections:Memcached運(yùn)行以來連接總數(shù)
connection_structures:Memcached分配的連接結(jié)構(gòu)數(shù)量
cmd_get:get命令請求次數(shù)
cmd_set:set命令請求次數(shù)
cmd_flush:flush命令請求次數(shù)
get_hits:get命令命中次數(shù)
get_misses:get命令未命中次數(shù)
delete_misses:delete命令未命中次數(shù)
delete_hits:delete命令命中次數(shù)
incr_misses:incr命令未命中次數(shù)
incr_hits:incr命令命中次數(shù)
decr_misses:decr命令未命中次數(shù)
decr_hits:decr命令命中次數(shù)
cas_misses:cas命令未命中次數(shù)
cas_hits:cas命令命中次數(shù)
cas_badval:使用擦拭次數(shù)
auth_cmds:認(rèn)證命令處理的次數(shù)
auth_errors:認(rèn)證失敗數(shù)目
bytes_read:讀取總字節(jié)數(shù)
bytes_written:發(fā)送總字節(jié)數(shù)
limit_maxbytes:分配的內(nèi)存總大小(字節(jié))
accepting_conns:服務(wù)器是否達(dá)到過最大連接(0/1)
listen_disabled_num:失效的監(jiān)聽數(shù)
threads:當(dāng)前線程數(shù)
conn_yields:連接操作主動(dòng)放棄數(shù)目
bytes:當(dāng)前存儲(chǔ)占用的字節(jié)數(shù)
curr_items:當(dāng)前存儲(chǔ)的數(shù)據(jù)總數(shù)
total_items:啟動(dòng)以來存儲(chǔ)的數(shù)據(jù)總數(shù)
evictions:LRU釋放的對象數(shù)目
reclaimed:已過期的數(shù)據(jù)條目來存儲(chǔ)新數(shù)據(jù)的數(shù)目
Memcached stats items 命令
Memcached stats items 命令用于顯示各個(gè) slab 中 item 的數(shù)目和存儲(chǔ)時(shí)長(最后一次訪問距離現(xiàn)在的秒數(shù))。
語法:
stats items 命令的基本語法格式如下:
stats items
實(shí)例
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 命令用于顯示各個(gè)slab的信息,包括chunk的大小、數(shù)目、使用情況等。
語法:
stats slabs 命令的基本語法格式如下:
stats slabs
實(shí)例
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的大小和個(gè)數(shù)。
該信息返回兩列,第一列是 item 的大小,第二列是 item 的個(gè)數(shù)。
語法:
stats sizes 命令的基本語法格式如下:
stats sizes
實(shí)例
stats sizes
STAT 96 1
END
Memcached flush_all 命令
Memcached flush_all 命令用于用于清理緩存中的所有?key=>value(鍵=>值)?對。
該命令提供了一個(gè)可選參數(shù)?time,用于在制定的時(shí)間后執(zhí)行清理緩存操作。
語法:
flush_all 命令的基本語法格式如下:
flush_all [time] [noreply]
實(shí)例
清理緩存:
set runoob 0 900 9memcached
STOREDget runoob
VALUE runoob 0 9memcachedENDflush_all
OKget runoobEND
使用Python操作memcache
Python連接memcached的庫有很多,處于簡單以及高效的原則,最終選擇了pymemcache,
優(yōu)點(diǎn)
完全實(shí)現(xiàn)了memcached text協(xié)議
對于send/recv操作可以配置timeout
支持"noreply"特性,該可行可以先出的提高寫的速度
使序列化/反序列化更簡單
可以將網(wǎng)絡(luò)異常,memecached錯(cuò)誤當(dāng)成是緩存丟失
安裝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') ?
最佳實(shí)踐
在構(gòu)造Client時(shí),添加timeout 的配置,防止block操作
使用“noreply”來提高性能,默認(rèn)情況下改屬性在“set”, “add”, “replace”, “append”, “prepend”, and “delete”.操作時(shí)是開啟的,“cas”, “incr” and “decr”.操作時(shí)關(guān)閉的
盡可能的使用get_many以及gets_many操作,來減少round trip的操作實(shí)踐
使用“ignore_exc” 屬性,將網(wǎng)絡(luò)異常,memecached錯(cuò)誤當(dāng)成是緩存丟失
主要URL:
pypi:https://pypi.python.org/pypi/pymemcache