Redis协议规范(译文) (2)

当服务器使用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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsfwx.html