Clever Castle
749 words
4 minutes
REDIS RESP协议
2023-05-15

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 typeMinimal protocol versionCategoryFirst byte
Simple stringsRESP2Simple+
Simple ErrorsRESP2Simple-
IntegersRESP2Simple:
Bulk stringsRESP2Aggregate$
ArraysRESP2Aggregate*
NullsRESP3Simple_
BooleansRESP3Simple#
DoublesRESP3Simple,
Big numbersRESP3Simple(
Bulk errorsRESP3Aggregate!
Verbatim stringsRESP3Aggregate=
MapsRESP3Aggregate%
SetsRESP3Aggregate~
PushesRESP3Aggregate>

Client Handshake#

一个新的RESP连接的第一个session应该是HELLO命令。这一方式可以完成下面两个目标:

  1. 它可以使得服务器和RESP2向后兼容。
  2. HELLO命令返回服务器的相关信息,以及应该使用的协议

HELLO命令的语法如下:

HELLO <protocol-version> [optional-arguments]

多命令和管道化#

客户端使用同一个连接去下发多个命令。客户端可以将多个命令合并成一个操作。客户端可以跳过读响应并且继续发送命令。

REDIS RESP协议
https://blog.ivyxjc.com/posts/redis-resp/
Author
ivyxjc
Published at
2023-05-15