目录
1. 什么是 RESP 协议
RESP(Redis Serialization Protocol)是 Redis 服务端与客户端之间通信的协议。
RESP3 是 RESP version 2 的更新版本。RESP v2 大致从 Redis 2.0 开始支持(其实 1.2 就支持了,只不过 Redis 2.0 是第一个仅支持此协议的版本)。
2. RESP 3 实现的类型
同 RESP v2 的
- Arrays:N个其他类型的有序集合
- Blob string:二进制安全字符串
- Simple string:节省空间的非二进制安全字符串
- Simple error:节省空间的非二进制安全错误代码和消息
- Number:有符号的 64 位范围内的整数
RESP 3
- Null:一个空值,用来替代 RESP v2 的 *-1 和 $-1
- Double:浮点数
- Boolean:true 或 false
- Blob error:二进制感觉错误码和消息
- Verbatim string:二进制安全字符串,应在不进行任何转义或过滤的情况下显示
- Map:键值对的有序集合。键和值可以是任何其他 RESP3 类型
- Set:N 个其他类型的无序集合
- Attribute:与 Map 类似。
- Push:与 Array 类似。
- Hello:与 Map 类似。仅用在客户端与服务端建立连接时
- Big number:无法用数字类型表示的大数字
3. HELLO 命令切换 RESP 协议
HELLO <protocol-version> [AUTH <username> <password>]
HELLO 2 或 HELLO 3 (切换 RESP 协议 2 或 3)
127.0.0.1:6379> HELLO 4
(error) NOPROTO unsupported protocol version
127.0.0.1:6379> HELLO 1
(error) NOPROTO unsupported protocol version
127.0.0.1:6379> HELLO 3
1# "server" => "redis"
2# "version" => "6.0.4"
3# "proto" => (integer) 3
4# "id" => (integer) 4
5# "mode" => "standalone"
6# "role" => "master"
7# "modules" => (empty array)
HELLO 2 + AUTH (切换 RESP 协议并切换认证用户)
// 切换到默认用户
127.0.0.1:6379> HELLO 2 AUTH default nopass
1) "server"
2) "redis"
3) "version"
4) "6.0.4"
5) "proto"
6) (integer) 3
7) "id"
8) (integer) 4
9) "mode"
10) "standalone"
11) "role"
12) "master"
13) "modules"
14) (empty array)
// 切换到 helloworld 用户
127.0.0.1:6379> HELLO 2 AUTH helloworld mypass
1# "server" => "redis"
2# "version" => "6.0.4"
3# "proto" => (integer) 3
4# "id" => (integer) 4
5# "mode" => "standalone"
6# "role" => "master"
7# "modules" => (empty array)
返回的 Map 说明
- "server" => "redis" // 服务名称
- "version" => "6.0.4" // 版本号
- "proto" => (integer) 3 // 支持的最高协议
- "id" => (integer) 4 // 客户端连接 ID
- "mode" => "standalone" // 模式:"standalone", "sentinel", "cluster"
- "role" => "master" // "master" 或 "replica"
- "modules" => (empty array) // 加载的模块列表
对比 RESP v2 和 RESP3 的 HELLO 命令返回结果,我们可以发现 RESP3 的展示效果更佳友好。