memcached协议
memcached協(xié)議
舊版:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
新版:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
一、協(xié)議
????? ? memcached的客戶端使用TCP連接同memcached進(jìn)行交互,memcached服務(wù)器監(jiān)聽(tīng)指定的端口(默認(rèn)端口是11211)。Client連接到memcached服務(wù)器,發(fā)送指令,獲取數(shù)據(jù),然后關(guān)閉連接。
?????? ?通常沒(méi)有必要發(fā)送任何命令來(lái)關(guān)閉某個(gè)會(huì)話。客戶端可以在任何時(shí)候關(guān)閉不需要的連接。然而,通常鼓勵(lì)客戶端緩存這些連接,因?yàn)閙emcached服務(wù)器本身就被設(shè)計(jì)成為一個(gè)可以支持成百上千個(gè)連接的服務(wù)器,而客戶端緩存了連接后,就可以避免重復(fù)的建立連接的開(kāi)銷。
??????? memcached協(xié)議中包含兩部分?jǐn)?shù)據(jù),文本行和非結(jié)構(gòu)化數(shù)據(jù)。前者是來(lái)自客戶端的命令或來(lái)自服務(wù)器端的響應(yīng),后者代表客戶端存取的數(shù)據(jù)。命令以\r\n結(jié)尾,數(shù)據(jù)可以是\r,\n或者\(yùn)r\n結(jié)尾來(lái)標(biāo)識(shí)各自部分的結(jié)束。
二、鍵
??????? memcached一般通過(guò)key來(lái)存儲(chǔ),一個(gè)key的長(zhǎng)度一般不能超過(guò)250字符。key不能包含控制字符或空白字符
三、命令
有三種類型的命令:
??? 1、存儲(chǔ)命令:set、add、replace、append、prepend、cas
??? 2、讀取命令:get、gets
??? 3、第三種命令,不涉及到非結(jié)構(gòu)化數(shù)據(jù)。客戶端發(fā)出這樣的命令,服務(wù)端會(huì)返回響應(yīng)結(jié)果
1、過(guò)期時(shí)間
??????? 過(guò)期時(shí)間的取值,有兩種:一種是Unix時(shí)間(自1970.1.1開(kāi)始到現(xiàn)在的秒數(shù)),另一種是相對(duì)當(dāng)前時(shí)間的秒數(shù)。如果過(guò)期時(shí)間的秒數(shù)大于60*60*24*30(即30天),則服務(wù)端認(rèn)為是Unix時(shí)間。
2、錯(cuò)誤設(shè)置
??????? 客戶端發(fā)出的每個(gè)命令,服務(wù)端可能會(huì)返回錯(cuò)誤提示字符。錯(cuò)誤提示字符有如下三種:
????? 1)??ERROR\r\n :表示客戶端發(fā)送的命令不存在
????? 2)??CLIENT_ERROR <error>\r\n :表示客戶端的輸入有錯(cuò)誤
????? 3)??SERVER_ERROR <error>\r\n :服務(wù)器端的錯(cuò)誤
3、存儲(chǔ)命令:
命令格式:<command name> <key><flags> <exptime> <bytes> [noreply]\r\n
命令名:如set、add、replace、append、prepend
| 命令名稱 | 作用 |
| set | 存儲(chǔ)這個(gè)數(shù)據(jù) |
| add | 存儲(chǔ)這個(gè)數(shù)據(jù),當(dāng)且僅當(dāng)這個(gè)key不存在的時(shí)候 |
| replace | 存儲(chǔ)這個(gè)數(shù)據(jù),當(dāng)且僅當(dāng)這個(gè)key存在 |
| append | 將數(shù)據(jù)存放在已存在的key對(duì)應(yīng)的內(nèi)容的后面,忽略<flags>和<exptime> |
| prepend | 將數(shù)據(jù)存放在已存在的key對(duì)應(yīng)的內(nèi)容的前面,忽略<flags>和<exptime> |
| cas | 存儲(chǔ)這個(gè)數(shù)據(jù),當(dāng)且僅當(dāng)該數(shù)據(jù)自從最后被獲取到現(xiàn)在沒(méi)有被更新 |
flags:一個(gè)任意的32位(舊版本是16位)無(wú)符號(hào)整數(shù)
exptime:過(guò)期時(shí)間,如果為0,表示永不過(guò)期。單位秒
bytes:表示將要存儲(chǔ)的數(shù)據(jù)的字節(jié)數(shù),可以為0。要存儲(chǔ)的內(nèi)容的字節(jié)數(shù),必須等于該值,不能大于也不能小于。
例子:將一個(gè)整數(shù)12,存放到memcache中,key為var,flags為1,過(guò)期時(shí)間為1000,字節(jié)數(shù)為2
用telnet連接memcached服務(wù)器端:
輸入命令如下:set var 1 1000 2,然后按回車,之后輸入要存儲(chǔ)是數(shù)據(jù):12,按回車,服務(wù)器返回STORED,如下:
通過(guò)get命令查看剛才存儲(chǔ)的內(nèi)容:
4、獲取命令
格式:
????? get? <key>*\r\n
????? gets <key>*\r\n
<key>*,表示可以有多個(gè)key,各個(gè)key之間用空格隔開(kāi)。
執(zhí)行該命令,服務(wù)器返回0個(gè)或多個(gè)item,每個(gè)item的格式如下:
? ??? VALUE <key> <flags><bytes> [<cas unique>]\r\n
? ??? <data block>\r\n
bytes為數(shù)據(jù)內(nèi)容的長(zhǎng)度,data block為key對(duì)應(yīng)的數(shù)據(jù)內(nèi)容
例子:
5、刪除命令
格式: delete <key> [noreply]\r\n
noreply參數(shù),告訴服務(wù)器不用發(fā)送響應(yīng)
該命令的返回結(jié)果,可能是:
????? ?DELETE\r\n???? ??表示刪除成功
????? ?NOT_FOUND\r\n? ?沒(méi)有對(duì)應(yīng)的key
例子:
6、增加/減少命令
命令格式:
???? ??incr <key> <value> [noreply]\r\n?? 或? ?decr <key> <value> [noreply]\r\n
value為要增加或減少的值。
操作成功,服務(wù)器返回操作之后的值。
對(duì)于decr操作,如果操作之后的值小于0,則置為0
不能直接使用incr和decr,必須先set或者add后再使用,而且值為數(shù)字類型,在增加時(shí),存儲(chǔ)的區(qū)域會(huì)擴(kuò)展。
例子:
7、touch
該命令用來(lái)更新已存在的item的過(guò)期時(shí)間,格式如下:(低版本不支持該命令)
????? touch <key> <exptime> [noreply]\r\n
執(zhí)行該命令后,如果返回”TOUCHED\r\n”,則執(zhí)行成功
8、統(tǒng)計(jì)命令
命令格式:
??? 1)????stats\r\n???????? 查看通用的統(tǒng)計(jì)信息
??? 2)????stats <args>\r\n
通用統(tǒng)計(jì)信息,例子:
具體含義:
| 名稱 | 類型 | 含義 |
| pid | 32u (32位無(wú)符號(hào)整數(shù)) | memcached server的pid |
| uptime | 32u | memcached server自啟動(dòng)到現(xiàn)在的時(shí)間(秒) |
| time | 32u | 當(dāng)前UNIX的時(shí)間 |
| version | string | memcached server的版本號(hào) |
| pointer_size | 32 | 操作系統(tǒng)默認(rèn)的指針大小 |
| curr_items | 32u | 當(dāng)前存儲(chǔ)的item數(shù)目 |
| total_items | 32u | server從啟動(dòng)到現(xiàn)在,總共累計(jì)存儲(chǔ)的item數(shù)目 |
| bytes | 64u | 當(dāng)前存儲(chǔ)item所花費(fèi)的字節(jié)數(shù) |
| curr_connections | 32u | 當(dāng)前的客戶端連接數(shù) |
| total_connections | 32u | server從啟動(dòng)到現(xiàn)在,累計(jì)的客戶端連接數(shù) |
| connection_structures | 32u | server分配的連接結(jié)構(gòu)數(shù) |
| cmd_get | 64u | get的次數(shù) |
| cmd_set | 64u | set的次數(shù) |
| get_hits | 64u | get命中的次數(shù) |
| get_misses | 64u | get沒(méi)有命中,miss的次數(shù) |
| evictions | 64u | 為新的item釋放內(nèi)存空間而被移除的有效item的數(shù)目。如果cache的size比較小,則淘汰策略經(jīng)常發(fā)生 |
| bytes_read | 64u | 從cache中讀取的總字節(jié)數(shù) |
| bytes_written | 64u | 寫入cache的總字節(jié)數(shù) |
| limit_maxbytes | 32u | 該memcached server分配的最大內(nèi)存數(shù)量 |
9、item統(tǒng)計(jì)信息
stats命令后面帶上參數(shù):items。? 返回存儲(chǔ)在每個(gè)slab的item信息,格式如下:
?????? STAT items:<slabclass>:<stat><value>\r\n
例子:
10、itemsize統(tǒng)計(jì)信息
stats命令后面帶上參數(shù)sizes,返回存儲(chǔ)在cache中的總體大小及item數(shù)目。
注意:該命令會(huì)鎖住cache,它會(huì)遍歷每個(gè)item并計(jì)算大小,在此之間,我們是無(wú)法訪問(wèn)server的,因此要慎重使用該命令。
返回結(jié)果的格式如下:
???? <size> <count>\r\n
其中:
???? 'size' is an approximate size of the item,within 32 bytes.
???? 'count' is the amount of items that existwithin that 32-byte range.
例子:
11、slab統(tǒng)計(jì)信息
stats命令帶上參數(shù)slabs,返回memcached運(yùn)行期間創(chuàng)建的每個(gè)slab的信息。
數(shù)據(jù)格式:STAT <slabclass>:<stat> <value>\r\n
例子:
| 名稱 | 含義 |
| chunk_size | 每個(gè)塊的大小。一個(gè)item使用一個(gè)大小適當(dāng)?shù)膲K。 |
| chunks_per_page | 一頁(yè)的塊數(shù),一頁(yè)的默認(rèn)大小小于等于1M,,chunks_per_page * chunk_size = 1MB。 slab按頁(yè)分配,每頁(yè)劃分成不同的塊 |
| total_pages | 分配給slab的頁(yè)數(shù) |
| total_chunks | 分配給slab的塊數(shù) |
| used_chunks | 已分配給item的塊數(shù) |
| free_chunks | 未分配給item的塊數(shù) |
| free_chunks_end | 目前可以使用的塊數(shù) |
| mem_requested | 請(qǐng)求存儲(chǔ)在該slab的字節(jié)數(shù) |
| active_slabs | 已經(jīng)分配的slab數(shù)量 |
| total_malloced | 已經(jīng)分配給slab的字節(jié)數(shù) |
item存放在slab中,該slab的大小大于或等于該item的大小。mem_requested表示一個(gè)slab中所有item的大小。
total_chunks * chunk_size – mem_requested,表示一個(gè)slab中所浪費(fèi)的內(nèi)存大小。如果有很多浪費(fèi),則需要考慮調(diào)整slab因子
12、其他命令
???? 1)???flush_all :執(zhí)行該命令,將導(dǎo)致memcache中所存在的所有item都失效。也可以指定在一段時(shí)間之后失效。例子:
??? 2)???version : 查看memcache的版本號(hào)
??? 3)quit :關(guān)閉連接
總結(jié)
以上是生活随笔為你收集整理的memcached协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 郭亮村私家车能开上去吗
- 下一篇: 把页面上DIV元素生成图片