多条批量回复¶
像 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 对象,
而不是一个空数组。