-
redis通信协议
redis通信协议由tcp协议进行数据交互,默认端口为6379
请求
Redis 服务器接受命令以及命令的参数。
服务器会在接到命令之后,对命令进行处理,并将命令的回复传送回客户端。
命令格式为:
1 2 3 4 5 6 |
|
命令本身也作为协议的其中一个参数来发送。
例如:
1 |
|
tcp原始数据打印为:
1 2 3 4 5 6 7 8 |
|
实际数据为:
string(34) "*3CRLF$3CRLFsetCRLF$1CRLFa$8CRLFtioncicoCRLF"
CRLF也就是"\r\n"
redis 响应
当redis服务器接收到请求时,会做出响应,redis会根据不同的命令以及数据,返回不同类型的数据
redis响应类型
通过检查redis服务器返回数据的第一个字节,可确定这个回复是什么类型:
1 2 3 4 5 |
|
状态回复
一个状态回复(或者单行回复,single line reply)是一段以 “+” 开始、 “\r\n” 结尾的单行字符串。
例如:
当你set a tioncic之后,redis服务器会给你回复:
1 |
|
错误回复
错误回复第一个字节以"-"开头:
示例:
当你 st a tioncico 发送不存在的"st"命令时:
1 |
|
在 “-” 之后,直到遇到第一个空格或新行为止,这中间的内容表示所返回错误的类型。剩余内容为错误内容
除了ERR错误这种通用型错误之外,还有更加特定的错误消息,例如:
1 |
|
整数回复
由":"开头,\r\n结尾的消息为整数回复,例如:
1 |
|
":"到\r\n中间的内容即是整数回复
返回值的唯一限制是该数据必须用64位整数存储
批量回复
服务器使用批量回复来返回二进制安全的字符串,字符串的最大长度为 512 MB 。
例如:
get a (在上面的例子中,已经set a的值为tioncico)
将返回
1 |
|
服务器发送的内容格式为:
1 2 3 4 5 6 |
|
特殊情况
1:当你的数据本身带\r\n时,无需顾虑,直接跟着回复内容的长度值进行获取,里面包含了这个的\r\n,但如果你的tcp客户端是通过\r\n进行分批次获取数据,需要额外的进行判断,组装数据
2:如果当你get一个不存在的键时,redis将会给你返回"$-1\r\n" 来表示该数据不存在,注意,它不是表达空字符串,而是表达它为null
多条批量回复
多条批量回复由"*" 开头,后面的数字代表共有几条回复,例如:
1 |
|
listA是本人已经add过的集合键名,数据如下:
将回复:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
由于\r\n太多,这里不处理为字符串显示
可看出:
1 2 3 4 5 6 7 8 9 10 |
|
注意事项
1:多条批量回复,也可能后面跟着一个*多条批量回复,比如在geohash里面: *1后面跟着*2,或者可能*2后面跟着*2,代表这个回复,有2条回复,并且回复里面也有2条回复
2:$0代表着空字符串
3:$-1代表着null
php实现
本人使用swoole client协程客户端,已经实现了redis的通信协议,组件地址:https://github.com/easy-swoole/redis
核心处理代码如下:
代码使用swoole tcp客户端,配置为每次根据\r\n读取,每次读取到\r\n时返回
请求:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
|
注,本文协议内容参考了https://blog.csdn.net/tanswer_/article/details/80846757文章
本文为仙士可原创文章,本人转载复制