请求协议:
*<参数数量> 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进行解析。