设为首页 加入收藏

TOP

Redis 客户端与服务端通信协议
2014-11-24 01:43:15 来源: 作者: 【 】 浏览:1
Tags:Redis 客户端 服务 通信 协议

背景


在跟踪REDIS服务端处理命令流程的时候,发现在服务端processInputBuffer里收到的字符串并非是在客户端输入的,而是进行了某种编码。比如,客户端输入get a,实际服务端打印出来的是


buf= *2
$3
get
$1
a


最开始认为是在服务端某段代码对客户端送过来的字符串进行处理,可能是出于某些考虑,后来发现从SOCKET读取过来就已经转换过了,所以就应该是客户端和服务端的通信协议,我对这个就开始产生了很浓厚的兴趣,*和$符号必定是有特殊意义的。


客户端处理流程


在main函数启动后,与服务端进行连接调用repl()函数,在该函数初始化和调用命令行的历史记录(允许你上下翻动历史)。


最后进入cliSendCommand函数处理命令,对于需要发送到服务端的命令调用redisAppendCommandArgv的流程。


为了分析里面的通信协议,对redisAppendCommandArgv函数的黑盒测试,得出以下规律。


可以得出规律,是将argc argv在具体化,第一个参数,也就是*开始相当于argc, 表示后续有几个对象,$后面的数字表示紧跟后面的字符串有几个字节。如get a ab,一共3个,分别是get ,a,b。 $3表示后面的get是3个字节。


官方文档


之前都是自己根据代码的跟踪猜的,更详细的更专业的回答在这里。


http://redis.readthedocs.org/en/latest/topic/protocol.html


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux SHELL 抓取错误日志脚本 下一篇对JQuery进行下标操作得到的是js..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: