
Redis服务端与客户端之间的通信协议为RESP(Redis Serialization Protocol)。RESP3(Redis Serialization Protocol version 3)是Redis 6引入的一种新的通信协议,相对于其前身RESP2,RESP3在多个方面进行了改进和增强。
RESP2协议在Redis 6.0版本前,Redis一直使用RESP 2协议。RESP 2协议有以下几个缺点:
RESP3协议Redis 6.0升级了RESP协议,主要改进了以下方面:
RESP 3协议可分为简单类型和聚合类型,后者是前者的组合。RESP 3协议的基本格式如下:
| 标识符 | 数据 | 分隔符+换行符 |
|---|
以字符串为例,在RESP 3中返回”Hello World“的格式如下:
+Hello World\r\n其中,+为一般字符串的标识符,hello world是数据内容。\r\n分别是分隔符和换行符,后续用表示。
hello 3命令。当响应结果为字符串、整数等简单类型时,RESP 3采用简单类型表示。
blob string二进制字符串用$作为标识符,第一行数据为长度,第二行数据为实际数据。
格式: $。它基本上与RESP的早期版本完全相同。
示例:$11。
blob error二进制错误用!作为标识符。
格式: !。
示例:!21。
simple string格式: +。
示例:+HelloWorld。
simple error格式: -Error。
示例:-Error message。
verbatim string格式: =。
示例:=15。
该类型在开始时会用3个字符描述更详细的数据类型,如txt、mkd等。第4个字节始终为:。
Number格式: :。
示例::1234。
有效数字在有符号64位整数的范围内。较大的数字应该改用大数字类型。
null格式: _。
示例:_。
null没有数据标识符,_后直接为 CR和 LF。
double格式: ,。
示例:,1.23。
boolean布尔值用#作为标识符。true为#t,false为#f。
格式: #。
示例:#t。
big number大数用(作为标识符。
格式: (。
示例:(341232321321221455465456678667876。
当响应结果为字典、集合等复杂数据类型时,RESP 3采用聚合类型表示。聚合类型格式类似JSON,可嵌套简单类型。其语法格式如下:
<aggregate-type-char><numelements><CR><LF> ... numelements other types ...map type字典用 %作为标识符,第一行数据为字典大小,后续行为key-value数据。key为简单字符串,value视情况而定(字符串或整数)。
格式: %。
示例:%2。
set reply集合用~作为标识符,第一行数据为集合大小,后续为集合数据。
格式:~。
示例:
~5<CR><LF>
+orange<CR><LF>
+apple<CR><LF>
#t<CR><LF>
:100<CR><LF>
:999<CR><LF>array数组用*作为标识符,第一行数据为数组大小,后续为数组元素。
格式:*。
示例:*3。
attribute type属性类型用|作为标识符,第一行数据为属性个数,后续为属性key-value。
|1<CR><LF>
+key-popularity<CR><LF>
%2<CR><LF>
$1<CR><LF>
a<CR><LF>
,0.1923<CR><LF>
$1<CR><LF>
b<CR><LF>
,0.0012<CR><LF>
*2<CR><LF>
:2039123<CR><LF>
:9543892<CR><LF>push type推送类型是RESP 3较独特的类型,以>作为标识符。
格式:>。
示例:
>3<CR><LF>
+message<CR><LF>
+somechannel<CR><LF>
+this is the message<CR><LF>helloHello是开启RESP 3协议的特殊命令。通过Hello 3、Hello 2可切换RESP版本。
格式:Hello 。
示例:hello 3。