RESP
Redis serialization protocol (RESP) 是客户端需要实现的协议
RESP是二进制安全的,它使用前缀长度来转换批量数据。
RESP版本
请求-响应模型
Redis的请求可以管道化。管道化使得客户端可以同时发送多个命令,然后等待响应。 当一个RESP2连接订阅了一个发布/订阅通道,协议将改变语义并变为一个push
协议。客户端不再需要发送命令因为服务器会自动向客户端发送消息(根据客户端订阅的通道)。
MONITOR
命令。执行MONITOR
命令会将连接变为ad-hoc push mode。
Protected
模式。 从非本地环回地址连接一个处在Protected
模式的redis服务器会被拒绝,服务器会终止该连接。在终止连接之前,会无条件地发送一个-DENIED
响应,不管客户端是否写消息到socket。
RESP3推送类型。推送类型允许服务器向连接发送带外数据(out-of-band data),服务器可以在任何时刻推送数据,且数据无需与客户端执行的的命令相关。
RESP协议
RESP本质上是一个支持多种数据类型的序列化协议。在RESP中,数据的第一个字节决定了数据的类型。
Redis以以下的方式来使用RESP作为请求-响应协议:
- 客户端向服务器发送一个array和bulk strings。第一个(某些情况下是第二个)bulk string是命令的名字。
- 服务器响应一个RESP类型。响应的类型由命令的实现以及协议的版本来决定。
RESP是一个使用由标准ASCII编码的控制序列的二进制协议。
\r\n
(CRLF)是协议的终止符,会分割数据。
RESP序列化数据的第一个字符表明数据类型,后续的字节构成了类型的内容。
RESP的数据类型可以分为三大类:simple,bulk和aggregate
simple类型和变成语言中的基本数据类型(标量)很相似。
RESP字符串是simple或者bulk类型。simple字符串不包括回车符(\r)和换行符(\n)。bulk字符串可以包含任何二进制数据。bulk字符串可能会被进一步的编码和解码。
aggregate,例如Arrays和Maps,拥有可变数量的子元素和嵌套元素、
RESP data type | Minimal protocol version | Category | First byte |
---|---|---|---|
Simple strings | RESP2 | Simple | + |
Simple Errors | RESP2 | Simple | - |
Integers | RESP2 | Simple | : |
Bulk strings | RESP2 | Aggregate | $ |
Arrays | RESP2 | Aggregate | * |
Nulls | RESP3 | Simple | _ |
Booleans | RESP3 | Simple | # |
Doubles | RESP3 | Simple | , |
Big numbers | RESP3 | Simple | ( |
Bulk errors | RESP3 | Aggregate | ! |
Verbatim strings | RESP3 | Aggregate | = |
Maps | RESP3 | Aggregate | % |
Sets | RESP3 | Aggregate | ~ |
Pushes | RESP3 | Aggregate | > |
Client Handshake
一个新的RESP连接的第一个session应该是HELLO
命令。这一方式可以完成下面两个目标:
- 它可以使得服务器和RESP2向后兼容。
HELLO
命令返回服务器的相关信息,以及应该使用的协议
HELLO
命令的语法如下:
HELLO <protocol-version> [optional-arguments]
多命令和管道化
客户端使用同一个连接去下发多个命令。客户端可以将多个命令合并成一个操作。客户端可以跳过读响应并且继续发送命令。