通信协议(protocol)¶

👁️ 5271 ❤️ 841
通信协议(protocol)¶

多条批量回复¶

像 LRANGE 这样的命令需要返回多个值,

这一目标可以通过多条批量回复来完成。

多条批量回复是由多个回复组成的数组,

数组中的每个元素都可以是任意类型的回复,

包括多条批量回复本身。

多条批量回复的第一个字节为 "*" ,

后跟一个字符串表示的整数值,

这个值记录了多条批量回复所包含的回复数量,

再后面是一个 CRLF 。

客户端: LRANGE mylist 0 3

服务器: *4

服务器: $3

服务器: foo

服务器: $3

服务器: bar

服务器: $5

服务器: Hello

服务器: $5

服务器: World

在上面的示例中,服务器发送的所有字符串都由 CRLF 结尾。

正如你所见到的那样,

多条批量回复所使用的格式,

和客户端发送命令时使用的统一请求协议的格式一模一样。

它们之间的唯一区别是:

统一请求协议只发送批量回复。

而服务器应答命令时所发送的多条批量回复,则可以包含任意类型的回复。

以下例子展示了一个多条批量回复,

回复中包含四个整数值,

以及一个二进制安全字符串:

*5\r\n

:1\r\n

:2\r\n

:3\r\n

:4\r\n

$6\r\n

foobar\r\n

在回复的第一行,

服务器发送 *5\r\n ,

表示这个多条批量回复包含 5 条回复,

再后面跟着的则是 5 条回复的正文。

多条批量回复也可以是空白的(empty),

就像这样:

客户端: LRANGE nokey 0 1

服务器: *0\r\n

无内容的多条批量回复(null multi bulk reply)也是存在的,

比如当 BLPOP 命令的阻塞时间超过最大时限时,

它就返回一个无内容的多条批量回复,

这个回复的计数值为 -1 :

客户端: BLPOP key 1

服务器: *-1\r\n

客户端库应该区别对待空白多条回复和无内容多条回复:

当 Redis 返回一个无内容多条回复时,

客户端库应该返回一个 null 对象,

而不是一个空数组。

← 如何查已贷款项目进度 遭遇员工外部举报,用人单位怎么办?丨威科先行劳动法库 →