登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis HELLO 怎样查看服务器协议与认证返回值

来源:17golang原创

时间:2026-11-03 04:52:24 151浏览 收藏

Redis 连接建立后,想确认服务端支持哪种 RESP 协议、当前连接属于哪个实例,或者想把认证和连接命名放进一次握手,应该看 HELLO。它不是只返回一个“连通”结果:Redis 官方文档说明,HELLO 可以切换 RESP2/RESP3,并返回版本、连接 ID、运行模式、角色和模块等属性。

官方地址:https://redis.io/docs/latest/commands/hello/

实用结论:普通探活继续用 PING;连接初始化或协议排障使用 HELLO 2、HELLO 3,需要认证时把 AUTH username password 放在同一条 HELLO 中。认证失败时连接不会切换到 RESP3,仍要按 RESP2 失败路径处理。

HELLO 负责什么:协议协商与连接初始化

Redis 6 及以后支持 RESP2 和 RESP3。新连接默认从 RESP2 开始,因此老客户端仍可工作;客户端明确发送 HELLO 3 后,才把当前连接切到 RESP3。HELLO 的时间复杂度是 O(1),它更像“连接能力说明 + 协议握手”,而不是业务数据命令。

Redis HELLO 连接入口与 RESP2 RESP3 协议结果的静态结构说明图
图1:Redis HELLO 握手结构说明图,查看协议选择、认证和连接属性的静态关系。

它和 PING 的分工可以这样记:

命令主要用途能得到什么
PING连通性探活简单的 PONG 或消息回显
HELLO连接初始化与能力确认协议版本、服务器属性、可选认证和连接名

用 redis-cli 读取协议和认证返回值

下面的命令只使用占位密码,适合先看命令形态。没有认证要求时,直接查询当前连接上下文;指定协议版本时,命令会同时协商协议。

# 查看当前连接的协议和服务器属性,不切换协议
redis-cli -h 127.0.0.1 -p 6379 HELLO

# 明确保持 RESP2,便于兼容旧客户端的返回处理
redis-cli -h 127.0.0.1 -p 6379 HELLO 2

# 请求 RESP3;连接名用于在连接列表中识别该客户端
redis-cli -h 127.0.0.1 -p 6379 HELLO 3 SETNAME article-reader

# 在新连接初始化时同时协商 RESP3 并认证;密码仅为示例占位符
redis-cli -h 127.0.0.1 -p 6379 HELLO 3 AUTH default 'YOUR_PASSWORD'

AUTH 只能跟在协议版本后面;SETNAME 等价于给当前连接设置名称。若服务端使用 Redis 6 以前的版本,可能返回未知命令;若协议版本不存在,则会返回协议错误。命令输出不要当成固定字段顺序,RESP2 和 RESP3 的呈现方式不同,客户端应按字段读取。

返回值怎样读:字段与失败状态

成功返回通常包含以下信息。server 表示服务端类型,version 是版本,proto 是当前协议;RESP3 还会返回 id、mode、role 和 modules 等连接或实例属性。

Redis HELLO 返回字段与协议认证失败边界的静态结构说明图
图2:Redis HELLO 返回字段结构说明图,查看属性字段与失败状态的边界。
# 只筛选返回中常用的协议、版本和角色字段,避免把整段输出写入日志
# 说明:示例使用文本过滤,生产程序应使用客户端库的结构化响应
redis-cli -h 127.0.0.1 -p 6379 --raw HELLO 3 | grep -E '^(server|version|proto|id|mode|role|modules)$'

这个过滤示例的目的只是帮助快速定位字段,不代表所有版本都按同样顺序输出。更稳妥的程序逻辑是:先判断命令是否成功,再读取 proto;把 server、version 作为诊断信息,把 id、mode、role 作为连接上下文。

认证失败和旧服务端怎样降级

当 HELLO 3 AUTH default wrong-password 的凭据不对时,服务端会返回错误,不会完成协议切换,连接仍处于 RESP2。客户端不要在收到失败后直接按 RESP3 解码下一条响应;应记录错误、关闭或修复连接,再从明确的 RESP2/RESP3 初始化路径重试。

兼容策略可以分成三类:

  • 服务端支持 HELLO 且支持 RESP3:发送 HELLO 3,成功后按 RESP3 处理。
  • 服务端支持 HELLO 但只接受 RESP2:发送 HELLO 2 或无参数 HELLO,并保持 RESP2 解码。
  • 服务端不认识 HELLO 或认证失败:把错误作为连接初始化失败,不把它混同为业务命令失败。

如果客户端库已经封装了连接握手,优先使用库提供的协议和认证配置;直接拼接命令时必须确保密码不进入普通日志,并在连接关闭或重建时重新设置 SETNAME。

常见问题

HELLO 能完全替代 PING 吗?

不能完全替代。HELLO 适合握手和能力确认,PING 更适合轻量连通性探活;监控探活不需要每次都切换协议或记录一整组连接属性。

为什么 HELLO 3 失败后仍像 RESP2?

因为协议切换只有在 HELLO 成功后才生效。协议版本不支持、命令不存在或 AUTH 失败都会让连接停留在原来的 RESP2 状态。

把 HELLO 放在连接初始化边界,先判断返回是否成功,再决定响应解码方式;把 server/version/proto 用作能力确认,把 id/mode/role 用作连接排障信息,就能避免把“认证成功”“协议切换成功”和“服务端可达”混成一个结论。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>