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