Redis竟然还有自定义网络通信协议?

网络 网络管理 Redis
凡是网络通信,皆需要双方遵守一致的协议才能互联。Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。

[[385171]]

凡是网络通信,皆需要双方遵守一致的协议才能互联。Redis协议在如下几点之间做出了折衷:

  • 实现简单
  • 被计算机快速解析
  • 有一定的可读性

网络层

Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。

请求

Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并响应给客户端。

新的统一请求协议

新的统一协议在Redis 1.2中引入,在Redis 2.0中,成为与Redis服务器通讯的标准方式。

在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。

如下是通用形式:

  1. *<number of arguments> CR LF 
  2. $<number of bytes of argument 1> CR LF 
  3. <argument data> CR LF 
  4. ... 
  5. $<number of bytes of argument N> CR LF 
  6. <argument data> CR LF 

示例:

  1. ➜  ~ nc localhost 6379 
  2. keys * 
  3. *2 
  4. $18 
  5. user:sign:5:202101 
  6. $18 
  7. seckill_vouchers:6 

上面的命令看上去像是单引号字符串,所以可在查询中看到每个字节的准确值:

  1. "*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用不同的响应类型回复命令。它可能从服务器发送的第一个字节开始校验回复类型:

单行响应

响应的第一个字节将是+

  1. set java edge 
  2. +OK 

错误消息

响应的第一个字节是-

  1. keys* 
  2. -ERR unknown command `keys*`, with args beginning with

整型数字

响应的第一个字节将是:

批量响应

第一个字节将是$

  1. keys * 
  2. *2 
  3. $18 
  4. user:sign:5:202101 
  5. $18 
  6. seckill_vouchers:6 

多个批量响应

  1. 响应的第一个字节将是* 

 

 

责任编辑:姜华 来源: JavaEdge
相关推荐

2021-05-29 16:12:00

通信协议设备

2019-04-29 10:26:49

TCP网络协议网络通信

2010-06-09 11:31:55

网络通信协议

2024-02-20 19:53:57

网络通信协议

2010-06-09 11:57:42

网络通信协议

2010-06-14 19:13:28

网络通信协议

2021-08-13 11:27:25

网络通信数据

2010-07-01 15:45:22

网络通信协议

2010-06-09 12:20:34

网络通信协议层

2010-06-12 16:34:57

网络通信协议

2010-06-12 16:51:54

计算机网络通信协议

2022-01-09 23:38:42

通信协议网络

2023-11-04 09:06:11

2023-10-12 19:37:50

通信协议HTTP

2022-12-02 14:42:37

2010-06-11 14:31:08

通信协议

2009-04-20 11:12:54

共享协议网络故障

2019-05-27 06:05:20

物联网协议物联网IOT

2010-07-06 17:14:03

网关通信协议

2010-06-25 14:43:46

通信协议
点赞
收藏

51CTO技术栈公众号