Redis序列化协议RESP2

1,739 阅读1分钟

RESP全称Redis Serialization Protocol,是一种文本协议。

RESP协议响应格式

RESP响应数据结构分为五种格式:

  1. 单行字符串,以+符号开头;
  2. 多行字符串, 以$符号开头,后跟字符串长度;
  3. 整数, 以:符号开头,后跟整数的字符串形式;
  4. 错误消息, 以-符号开头;
  5. 数组, 以*号开头,后跟数组的长度。

注意:

  1. 无论是单行字符串还是多行字符串,如果有nil值,都会返回$-1
  2. 单行字符串可以使用多行字符串的形式表示;

示例

  1. 单行字符串,如服务端返回PONG, 使用换行符\r\n进行换行;
>> ping
+PONG\r\n
  1. 多行字符串,如Hello World,数字11表示字符串长度,并且使用换行符进行分隔;
>>get hello
$11\r\nhello world\r\n
  1. 整数,以:开头,以换行符结尾;
>> incr count
:1\r\n
>> incr count
:2\r\n
  1. 错误信息,例如输入一个不存在的命令gets,错误信息是-ERR开头,后面接具体错误信息
>> gets
-ERR unknown command `gets`, with args beginning with:
  1. 数组,是用*后面接数组长度,并且使用换行符分隔,数据中的元素按照数字和字符串的格式进行处理
>> get java python
*2\r\n$4\r\nbest\r\n$6\r\npretty\r\n

>> get java python
*2\r\n$4\r\nbest\r\n$6\r\npretty\r\n
  1. 空值,如果结果返回nil,使用多行字符串表示
>> get not_exists_key
$-1\r\n
  1. 嵌套,

RESP协议请求格式

RESP请求格式只有一种,使用多行字符串数组的形式表示。

  1. 使用*加数字表示命令和参数个数之和(命令本身的数量+参数的数量);
  2. 使用$加数字表示命令或者参数的字符串的长度。 如命令
set name bob

RESP会编码成:

*3\r\n$3\r\nset\r\n$4\r\nname\r\n$3\r\nbob\r\n