RESP全称Redis Serialization Protocol,是一种文本协议。
RESP协议响应格式
RESP响应数据结构分为五种格式:
- 单行字符串,以
+符号开头; - 多行字符串, 以
$符号开头,后跟字符串长度; - 整数, 以
:符号开头,后跟整数的字符串形式; - 错误消息, 以
-符号开头; - 数组, 以
*号开头,后跟数组的长度。
注意:
- 无论是单行字符串还是多行字符串,如果有
nil值,都会返回$-1; - 单行字符串可以使用多行字符串的形式表示;
示例
- 单行字符串,如服务端返回
PONG, 使用换行符\r\n进行换行;
>> ping
+PONG\r\n
- 多行字符串,如
Hello World,数字11表示字符串长度,并且使用换行符进行分隔;
>>get hello
$11\r\nhello world\r\n
- 整数,以
:开头,以换行符结尾;
>> incr count
:1\r\n
>> incr count
:2\r\n
- 错误信息,例如输入一个不存在的命令
gets,错误信息是-ERR开头,后面接具体错误信息
>> gets
-ERR unknown command `gets`, with args beginning with:
- 数组,是用
*后面接数组长度,并且使用换行符分隔,数据中的元素按照数字和字符串的格式进行处理
>> 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
- 空值,如果结果返回
nil,使用多行字符串表示
>> get not_exists_key
$-1\r\n
- 嵌套,
RESP协议请求格式
RESP请求格式只有一种,使用多行字符串数组的形式表示。
- 使用
*加数字表示命令和参数个数之和(命令本身的数量+参数的数量); - 使用
$加数字表示命令或者参数的字符串的长度。 如命令
set name bob
RESP会编码成:
*3\r\n$3\r\nset\r\n$4\r\nname\r\n$3\r\nbob\r\n