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进行解析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值