黄东旭解析 TiDB 的核心优势
562
2023-05-25
Redis竟然还有自定义网络通信协议?
凡是网络通信,皆需要双方遵守一致的协议才能互联。Redis协议在如下几点之间做出了折衷:
实现简单被计算机快速解析有一定的可读性
网络层
Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。
请求
Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并响应给客户端。
新的统一请求协议
新的统一协议在Redis 1.2中引入,在Redis 2.0中,成为与Redis服务器通讯的标准方式。
在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。
如下是通用形式:
*
示例:
➜ ~ nc localhost 6379 keys * *2 $18 user:sign:5:202101 $18 seckill_vouchers:6
上面的命令看上去像是单引号字符串,所以可在查询中看到每个字节的准确值:
"*2\r\n$18\r\nuser:sign:5:202101\r\n$18\r\nseckill_vouchers:6\r\n"
在Redis的响应中也使用这样的格式。批量回复时,这种格式用于每个参数。实际的统一请求协议是Redis用于返回列表项,并调用 Multi-bulk回复。仅仅是N个以以*\r\n为前缀的不同批量回复,是紧随的参数(批量回复)数目。
响应
Redis用不同的响应类型回复命令。它可能从服务器发送的第一个字节开始校验回复类型:
单行响应
响应的第一个字节将是+
set java edge +OK
错误消息
响应的第一个字节是-
整型数字
响应的第一个字节将是:
批量响应
第一个字节将是$
keys * *2 $18 user:sign:5:202101 $18 seckill_vouchers:6
多个批量响应
响应的第一个字节将是*
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。