*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:多行字符串(key:value 格式)
- CLUSTER NODES:多行字符串(每行一个节点)
- CLUSTER SLOTS:嵌套数组(槽位范围 + 节点信息)
- CLUSTER MEET:
OK - CLUSTER FORGET:
OK CLUSTER KEYSLOT key:Integer(槽位编号 0-16383)
*时间复杂度
因子命令不同而异:
- CLUSTER INFO /
NODES/SLOTS:O(1) - CLUSTER KEYSLOT:O(N),N 为 key 长度 - CLUSTER COUNTKEYSINSLOT:O(1) - CLUSTER GETKEYSINSLOT:O(log(N)),N 为槽位中的 key 数量
*示例
*查看集群状态信息
> 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 NODES 和 CLUSTER 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 重定向。