*Redis CLUSTER ADDSLOTSRANGE 命令

CLUSTER ADDSLOTSRANGE 将一段或多段连续的槽位范围分配给当前节点。


*语法

CLUSTER ADDSLOTSRANGE start-slot end-slot [start-slot end-slot ...]

*参数说明

参数 类型 必填 说明
start-slot Integer 槽位范围起始编号(0-16383)
end-slot Integer 槽位范围结束编号(0-16383,必须 ≥ start-slot)

*返回值

  • OK:所有槽位分配成功
  • Error:槽位已被其他节点分配、参数无效或超出范围

*时间复杂度

O(N),N 为分配的槽位总数。


*示例

*分配单个槽位范围

> CLUSTER ADDSLOTSRANGE 0 5460
OK

*分配多个不连续的槽位范围

> CLUSTER ADDSLOTSRANGE 0 1000 2000 3000 5000 5460
OK

*验证槽位分配

> CLUSTER NODES
... myself,master - 0 0 1 connected 0-1000 2000-3000 5000-5460

*完整分配示例(新建主节点)

# 假设 3 主 3 从集群,新节点分配 5461-10922
> CLUSTER ADDSLOTSRANGE 5461 10922
OK
> CLUSTER INFO
cluster_slots_assigned:16384
cluster_slots_ok:16384

*常见错误

错误 原因 解决
ERR Slot is already busy 槽位已被其他节点分配 先用 CLUSTER DELSLOTS 或 CLUSTER SETSLOT 释放
ERR Invalid or out of range slot 槽位编号不在 0-16383 范围内 检查槽位编号
ERR end slot is smaller than start slot end-slot < start-slot 确保 end-slot ≥ start-slot
ERR Trying to migrate keys in node 节点正在迁移槽位 等待迁移完成后再操作

*最佳实践

  • 优先使用 ADDSLOTSRANGE(Redis 7.0+)替代多次 ADDSLOTS,减少命令数量
  • 分配前先用 CLUSTER SLOTSCLUSTER NODES 确认槽位空闲
  • 集群首次创建时,将 16384 个槽位均匀分配给各主节点(约 5461 个/节点,3 主时)
  • 新节点加入集群后需先执行 CLUSTER MEET,再分配槽位
  • 大规模槽位分配建议分批执行,观察集群状态

*FAQ

Q1: ADDSLOTSRANGE 和 ADDSLOTS 有什么区别? A: ADDSLOTS 逐个指定槽位(CLUSTER ADDSLOTS 1 2 3 ...),ADDSLOTSRANGE 指定连续范围(CLUSTER ADDSLOTSRANGE 1 3 等效)。范围模式更简洁高效。

Q2: 为什么分配后 CLUSTER INFO 还是显示 fail? A: 需要所有 16384 个槽位都被分配后 cluster_state 才会变为 ok。检查是否还有未分配的槽位。

Q3: 能否分配已被其他节点持有的槽位? A: 不能直接分配。必须先用 CLUSTER SETSLOT ... NODE 迁移,或让原节点执行 CLUSTER DELSLOTS 释放。

Q4: Redis 哪个版本开始支持 ADDSLOTSRANGE? A: Redis 7.0.0 新增此命令。