当服务器使用Null 多行字符串回复时,客户端库API不应返回空字符串,而应返回nil对象。 例如,Ruby库应返回'nil',而C库应返回NULL(或在reply对象中设置特殊标志),依此类推。
RESP 数组客户端使用RESP 数组将命令发送到Redis服务器。 类似地,某些Redis命令将元素集合返回给客户端使用RESP 数组是回复类型。 一个例子是LRANGE命令,它返回列表的元素。
RESP数组使用以下格式发送:
*字符作为第一个字节,后跟数组中的元素数作为十进制数,后跟CRLF。
数组的每个元素的附加RESP类型。
所以空数组就是以下内容:
"*0\r\n"那么两个RESP批量字符串“foo”和“bar”的数组编码为:
"*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"正如您在数组前面加上* CRLF部分之后所看到的那样,组成数组的其他数据类型将一个接一个地连接起来。 例如,三个整数的数组编码如下:
"*3\r\n:1\r\n:2\r\n:3\r\n"数组可以包含混合类型,元素不必具有相同的类型。 例如,四个整数和批量字符串的列表可以编码如下:
*5\r\n :1\r\n :2\r\n :3\r\n :4\r\n $6\r\n foobar\r\n服务器发送的第一行是* 5 r n,以指定将跟随五个回复。 然后发送构成多重回复项目的每个回复。
Null 数组的概念也存在,并且是指定Null值的替代方法(通常使用Null 多行字符串,但由于历史原因,我们有两种格式)。
例如,当BLPOP命令超时时,它返回一个计数为-1的Null数组,如下例所示:
"*-1\r\n"当Redis使用Null数组回复时,客户端库API应返回空对象而不是空数组。 这是区分空列表和不同条件(例如BLPOP命令的超时条件)所必需的。
RESP中可以使用数组中嵌套数组。 例如,两个数组的数组编码如下:
*2\r\n *3\r\n :1\r\n :2\r\n :3\r\n *2\r\n +Foo\r\n -Bar\r\n第二个元素是Null。 客户端库应返回如下内容:
["foo",nil,"bar"]注意,这不是前面部分中所述的例外,而只是进一步指定协议的示例。
发送命令到 Redis 服务端既然熟悉RESP序列化格式,那么编写Redis客户端库的实现将很容易。 我们可以进一步讲述客户端和服务器之间的交互如何工作:
客户端向Redis服务器发送仅由Bulk Strings组成的RESP阵列。
Redis服务器回复发送任何有效RESP数据类型作为回复的客户端。
因此,例如,典型的交互可以是以下所示。
客户端发送命令LLEN mylist以获取存储在密钥mylist中的列表长度,服务器回复一个Integer回复,如下例所示(C:是客户端,S:服务器)。
C: *2\r\n C: $4\r\n C: LLEN\r\n C: $6\r\n C: mylist\r\n S: :48293\r\n通常我们将协议的不同部分与换行符分开以简化,但实际的交互是客户端发送*** 2 r n $ 4 r nLLEN r n $ 6 r nmylist r n**整体。
小结这是楼主第一次尝试翻译一篇技术文档,相对来说技术文档的英文阅读起来还是比较舒服的,相信有了第一次尝试,之后肯定会越来越顺利。由于楼主水平有限,文章中难免有纰漏,期望小伙伴的指出,感谢……。
参考链接Redis Protocol specification