*Redis HELLO 命令
HELLO 命令用于与 Redis 服务器进行协议协商握手,可选择切换 RESP 协议版本,并可选择进行身份验证。
*语法
HELLO [protover [AUTH username password] [SETNAME clientname]]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| protover | Integer | 否 | 协议版本:2(RESP2)或 3(RESP3)。默认使用当前连接协议 |
| AUTH username | String | 否 | ACL 用户名(Redis 6.0+),无 ACL 时可省略 |
| password | String | 否 | 密码,与 username 配对使用 |
| SETNAME clientname | String | 否 | 设置当前连接的客户端名称 |
*返回值
- Array:成功时返回服务器信息数组,包含以下字段:
server:服务器名称("redis")version:Redis 版本proto:当前协议版本(整数 2 或 3)id:连接 IDmode:服务器模式("standalone"、"sentinel"、"cluster")role:实例角色("master" 或 "replica")modules:已加载模块列表(数组)
- Error:协议版本不支持、认证失败、参数错误等
*时间复杂度
O(1)
*
*示例
*基本握手(协商 RESP3)
> HELLO 3
1# "server" => "redis"
2# "version" => "7.2.0"
3# "proto" => (integer) 3
4# "id" => (integer) 42
5# "mode" => "standalone"
6# "role" => "master"
7# "modules" => (empty array)
*握手并认证
> HELLO 3 AUTH default mypassword
1# "server" => "redis"
2# "version" => "7.2.0"
3# "proto" => (integer) 3
*切换回 RESP2
> HELLO 2
1) "server"
2) "redis"
3) "version"
4) "7.2.0"
5) "proto"
6) (integer) 2
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| NOPROTO unsupported protocol version | 请求的协议版本不受支持 | Redis 6.0 支持 RESP2,Redis 7.0 新增 RESP3 支持 |
| ERR invalid protocol version | protover 不是 2 或 3 | 传入 2 或 3 |
| WRONGPASS invalid username-password pair or user is disabled | 认证失败 | 检查用户名和密码是否正确,用户是否被禁用 |
*最佳实践
- 连接建立后建议立即发送 HELLO 协商协议版本,特别是需要使用 RESP3 新增数据类型(如 Map、Set、Verbatim String)的场景
- 客户端库通常自动发送 HELLO,应用层一般不需要手动调用
- RESP3 协议支持更丰富的数据类型返回(如 HGETALL 返回 Map 而非 flat array),可减少客户端解析开销
*FAQ
Q1: HELLO 必须在连接后立即发送吗? A: 不是必须的。不发送 HELLO 时连接默认使用 RESP2。但某些功能(如 RESP3 的数据类型)需要先通过 HELLO 3 协商。
Q2: HELLO 和 AUTH 有什么区别? A: AUTH 仅进行身份验证;HELLO 是协议握手,可选择性地包含 AUTH 参数。在需要同时切换协议版本和认证的场景下,使用 HELLO 更高效。
Q3: 发送 HELLO 2 后再发送 HELLO 3 可以吗? A: 可以,HELLO 允许在同一个连接中多次切换协议版本。