*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:连接 ID
    • mode:服务器模式("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 允许在同一个连接中多次切换协议版本。