最后更新:2022-03-03 05:33:52 手机定位技术交流文章
微信公众号:运维开发故事,作者:老郑
Redis 基于 RESP (Redis Serialization Protocal)协议来完成客户端和服务端通讯的。RESP 本质是一种文本协议,实现简单、易于解析。如下表所示:
类型 |
协议描述 |
实例 |
网络层 |
客户端和服务端通过 tcp/流式套接字来进行通讯,为了 防止粘包 因此命令或数据均以 rn (CRLF) 结尾 |
+okrn |
请求 |
*<参数数量> CR LF <参数的数据> CR LF <参数 N 的字节数量 >CR LF |
*2rn3rngetrn$13rnusername:1234rn。 见 callSendCommond -> redis AppendConnadnArgv -> redisFromatCommandArgv |
简单字符串回复 |
第一个字节+ |
+okrn |
错误回复 |
第一个字节- |
-ERR unknown command 'sa' rn |
整数回复 |
第一个字节: |
:0rn |
批量回复 |
第一个字节$ |
$6rnfoobarrn 空回复 $-1 |
多条批量 回复 |
第一个字节* |
5rn:1rn:2rn:3rn:4rn$6rnfoobarrn, 空回复0rn |
如果客户端和服务端在一台机器上。那么会对通讯协议进行优化,直接走本地回环
我们可以通过 tcpdump 命令来抓取客户端和服务端请求、响应的数据包, 命令如下:
我们以一条 `set msg100 1` 这条命令测试一下 ( 我本机是 mac 环境):
服务端抓包结果如下所示:
redis-cli 客户端效果:

客户端是对显示结果做了转化,在 redis-cli.c 文件中下面是它的部分源码
我们也可以使用 nc 命令来替代 redis-cli 命令行:
redis 命令是使用的是 redisCommand 数据结构来管理的。
针对sflag标示,这里可以看看 《redis 设计与实现》

flag 记录的是 flag 值与 sflag 进行运算的结果,见populateCommandTable函数
具体命令比较多
以 set 为例子 {“set”,setCommand,-3, “write use-memory @string”, 0,NULL,1,1,1,0,0,0}

本文由 在线网速测试 整理编辑,转载请注明出处。