*Redis CLUSTER DELSLOTSRANGE 命令

CLUSTER DELSLOTSRANGE 从当前节点移除一段或多段连续的槽位范围分配。


*语法

CLUSTER DELSLOTSRANGE 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 DELSLOTSRANGE 0 5460
OK

*移除多个不连续的槽位范围

> CLUSTER DELSLOTSRANGE 0 1000 2000 3000 5000 5460
OK

*验证槽位已移除

> CLUSTER NODES
... myself,master - 0 0 1 connected 1001-1999 3001-4999

*配合 ADDSLOTSRANGE 调整分配

> CLUSTER DELSLOTSRANGE 5000 5460
OK
> CLUSTER ADDSLOTSRANGE 5461 6000
OK

*常见错误

错误 原因 解决
ERR Slot is already unassigned 槽位已经不属于当前节点 确认槽位归属
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 Slot has keys in it 槽位中仍有数据 先迁移数据或删除 key

*最佳实践

  • 优先使用 DELSLOTSRANGE(Redis 7.0+)替代多次 DELSLOTS
  • 移除前必须确保槽位中无数据,否则可能导致数据丢失或集群状态异常
  • 生产环境建议先用 CLUSTER SETSLOT ... MIGRATING + MIGRATE 迁移数据,再移除槽位
  • 集群缩容时,先迁移槽位到新节点,再从旧节点移除
  • 大规模移除建议分批执行,每批后检查集群状态

*FAQ

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

Q2: 移除槽位后数据会丢失吗? A: 如果槽位中仍有 key,直接移除会导致数据不可访问。必须确保数据已迁移或删除。

Q3: 移除后 cluster_state 会变 fail 吗? A: 如果移除后存在未分配的槽位,cluster_state 会变为 fail。需要将这些槽位分配给其他节点。

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