redis 協議

請求協議

*<參數數量> CR LF
$<參數 1 的字節數量> CR LF
<參數 1 的數據> CR LF
...
$<參數 N 的字節數量> CR LF
<參數 N 的數據> CR LF

 

舉個例子:

//set mykey myvalue

*3

$3

SET

$5

mykey

$7

myvalue

這個命令實際協議值如下:

"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"  

ref:http://redisdoc.com/topic/protocol.html

processMultibulkBuffer 做內容解析函數(協議解析)

1 request內容保存在clinet->querybuf, 首先獲取參數個數

2 依次獲取參數長度、參數內容保存在client->argv裏面

3 當數據沒收全,返回REDIS_ERR,後續可讀回調繼續進行解析。

4 解析先會根據命令名 查找命令、校驗命令、然後調用call執行命令。

5 一直到請求個數都解析完(call),返回REDIS_OK

 

整個客戶端請求參數解析:

 

客戶端接收請求後回調readQueryFromClient 函數進行讀取客戶端send數據,redis支持兩種協議解析REDIS_REQ_INLINE和REDIS_REQ_MULTIBULK,其中REDIS_REQ_MULTIBULK 是採用上面請求協議;REDIS_REQ_INLINE 其他工具,比如telnet。 根據不同的協議處理函數不一樣:REDIS_REQ_MULTIBULK ->processMultibulkBuffer; REDIS_REQ_INLINE->processInlineBuffer, 協議解析完會保存請求參數到client->argv。如果數據沒有接收完會繼續接收,之後processCommand進行命令解析, 解析過程首先會lookupCommand查找命令,然後會參數校驗、參數個數校驗、身份校驗、maxmemory 內存清理、寫磁盤錯誤等過程,之後調用call(c,REDIS_CALL_FULL)進行命令處理,最後c->cmd->proc 調用proc進行解析。

發佈了83 篇原創文章 · 獲贊 8 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章