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