Skip to content

协议规范

网络层

客户端通过创建到 Rudis 服务器端口的 TCP 连接来连接(默认端口是 6379)。

虽然从技术上讲 RESP 并不特定于 TCP,但在 Rudis 的上下文中,该协议专门与 TCP 连接(或类似的面向流的连接,如 Unix 套接字)一起使用。

RESP 协议描述

RESP(REdis Serialization Protocol)是 Redis 序列化协议的简称。它是 Redis 服务器和客户端之间通信的标准协议。

简单字符串

简单字符串编码为加号(+)字符,后跟一个字符串。该字符串不能包含回车符(\r)或换行符(\n)字符,并以 CRLF(即 \r\n)结尾。

简单字符串以最小的开销传输短的非二进制字符串。例如,许多 Rudis 命令在成功时只回复 "OK"。这个简单字符串的编码是以下 5 个字节:

+OK\r\n

当 Rudis 回复简单字符串时,客户端库应该返回给调用者一个字符串值,该值由 + 之后的第一个字符组成,直到字符串末尾,不包括最后的 CRLF 字节。

要发送二进制字符串,请改用批量字符串。

错误

错误与简单字符串非常相似,但第一个字符是减号(-)而不是加号。错误的格式如下:

-ERR unknown command 'foobar'\r\n

客户端库应该将错误返回给用户,而不是像简单字符串那样作为普通字符串返回。

整数

整数编码为冒号(:)字符,后跟一个数字,最后以 CRLF 结尾。例如:

:1000\r\n

批量字符串

批量字符串用于表示长度最大为 512 MB 的二进制安全字符串。它编码为美元符号($),后跟字符串的字节数(前缀长度),然后是 CRLF,接着是实际数据,最后以 CRLF 结尾。

例如,"hello" 字符串的编码如下:

$5\r\nhello\r\n

空字符串的编码如下:

$0\r\n\r\n

RESP 还有一种特殊的批量字符串格式,用于表示 NULL 值。在这种特殊格式中,长度是 -1,没有数据和最终的 CRLF:

$-1\r\n

数组

数组编码为星号(*),后跟数组中元素的数量,然后是 CRLF,接着是每个元素的 RESP 编码。

例如,包含三个元素的数组 ["foo", "bar", "Hello"] 编码如下:

*3\r
$3\r
foo\r
$3\r
bar\r
$5\r
Hello\r

数组可以包含混合数据类型。例如,包含一个简单字符串、一个整数和一个数组的数组编码如下:

*3\r
+foo\r
:1000\r
*2\r
$3\r
bar\r
$5\r
Hello\r

空数组的编码如下:

*0\r\n

RESP 还允许数组中的元素为 NULL。这使用特殊的批量字符串 NULL 值($-1)来表示:

*3\r
$3\r
foo\r
$-1\r
$3\r
bar\r

NIL 数组

在某些情况下,服务器需要返回 NULL 数组的概念。这使用特殊格式编码,元素计数为 -1:

*-1\r\n

粘连命令处理机制

在使用 redis-rust 客户端库连接到 Rudis 服务器时,该库会在建立连接后立即连续发送两个 CLIENT 命令:

CLIENT SETINFO LIB-NAME redis-rs
CLIENT SETINFO LIB-VER 1.0.0-rc.4

这两个命令可能会在同一个 TCP 数据包中发送到服务器,形成所谓的"粘连命令"。Rudis 服务器经过特殊设计,能够正确处理这种情况,确保每个命令都能得到适当的响应,避免客户端在等待响应时超时。

Released under the GPL-3.0 License.