*Redis CLUSTER 命令

CLUSTER 命令是 Redis 集群管理的入口命令,用于获取和修改集群的状态信息、配置以及执行各类集群管理操作。


*语法

CLUSTER subcommand [arg [arg ...]]

*参数说明

参数 类型 必填 说明
subcommand String 子命令名称,如 INFO、NODES、SLOTS、MEET、FORGET 等
arg 可变 各子命令对应的参数

*常用子命令

子命令 说明
INFO 返回集群节点信息
NODES 返回集群节点配置信息
SLOTS 返回槽位到节点的映射
MEET 让当前节点与指定节点握手加入集群
FORGET 从集群中移除指定节点
REPLICATE 将当前节点设置为指定主节点的副本
FAILOVER 手动触发故障转移
ADDSLOTS 将槽位分配给当前节点
DELSLOTS 从当前节点移除槽位分配
KEYSLOT 计算 key 所在的槽位
COUNTKEYSINSLOT 统计指定槽位中的 key 数量
GETKEYSINSLOT 获取指定槽位中的 key 列表
SAVECONFIG 将节点配置保存到磁盘
BUMPEPOCH 增加集群配置纪元

*返回值

  • String / Array / Integer:返回值因子命令不同而异
  • Error:子命令不存在或参数错误

各子命令典型返回值:


*时间复杂度

因子命令不同而异:


*示例

*查看集群状态信息

> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1

*查看集群节点列表

> CLUSTER NODES
07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317741 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002 master - 0 1426238316232 2 connected 5461-10922

*计算 key 的槽位

> CLUSTER KEYSLOT mykey
(integer) 14687
> CLUSTER KEYSLOT user:1000
(integer) 7498

*节点握手加入集群

> CLUSTER MEET 192.168.1.10 6379
OK

*获取槽位中的 key

> CLUSTER COUNTKEYSINSLOT 5798
(integer) 50
> CLUSTER GETKEYSINSLOT 5798 10
1) "key1"
2) "key2"
3) "key3"

*常见错误

错误 原因 解决
ERR unknown subcommand 子命令名称错误 检查子命令拼写,参考官方文档
ERR This instance has cluster support disabled 当前节点未启用集群模式 检查配置 cluster-enabled yes
ERR Invalid node address MEET 时地址格式错误 提供正确的 IP 和端口
ERR I don't know about node FORGET 的节点 ID 不存在 确认节点 ID 正确

*最佳实践

  • 所有集群管理操作都通过 CLUSTER 命令及其子命令完成
  • 优先使用 CLUSTER NODESCLUSTER INFO 诊断集群状态
  • 生产环境避免频繁执行 CLUSTER SLOTS,缓存其输出
  • 添加节点先用 CLUSTER MEET,再分配槽位或设置复制关系
  • 使用 CLUSTER KEYSLOT 确认 key 的路由位置,排查数据分布问题

*FAQ

Q1: CLUSTER 命令和普通命令有什么区别? A: CLUSTER 命令仅在集群模式下可用(cluster-enabled yes),用于管理集群拓扑和状态,不操作具体数据。

Q2: CLUSTER NODES 的输出格式如何解读? A: 每行格式为 <id> <ip:port@cport> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot>。flags 包括 master/slave/myself/fail 等。

Q3: 为什么 CLUSTER INFO 显示 cluster_state:fail? A: 表示集群不完整,可能槽位未全部分配,或有节点下线。检查节点状态和槽位分配。

Q4: 客户端如何判断 key 该发往哪个节点? A: 客户端可以发送 CLUSTER SLOTS 获取槽位映射表,本地计算 CLUSTER KEYSLOT 的逻辑或使用 MOVED/ASK 重定向。