*Redis CLUSTER GETKEYSINSLOT 命令
CLUSTER GETKEYSINSLOT 返回指定哈希槽中本地存储的键名列表,用于槽迁移(resharding)时获取待迁移的键。
*语法
CLUSTER GETKEYSINSLOT slot count
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| slot | Integer | 是 | 哈希槽编号,范围 0 ~ 16383 |
| count | Integer | 是 | 返回的最大键数量,上限为 65 536 |
*返回值
- Array:键名数组。最多返回
count个键。若槽为空或不在当前节点,返回空数组。
*时间复杂度
O(log(N)),其中 N 为请求的键数量。
*示例
*获取指定槽中的键名
> CLUSTER GETKEYSINSLOT 5798 10
1) "user:1000"
2) "user:1001"
3) "order:500"
4) "session:abc123"
*空槽返回空数组
> CLUSTER GETKEYSINSLOT 1234 100
(empty array)
*批量迁移场景
> CLUSTER GETKEYSINSLOT 5798 100
1) "key1"
2) "key2"
...
> MIGRATE 192.168.1.20 6379 "" 0 5000 KEYS key1 key2 ...
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR Invalid or out of range slot | slot 超出 0~16383 范围 | 确保 slot 在有效范围内 |
| ERR wrong number of arguments | 缺少 slot 或 count 参数 | 补充两个参数 |
| ERR value is not an integer | count 不是整数 | 使用正整数作为 count |
| ERR This instance has cluster support disabled | 未启用集群模式 | 在 redis.conf 中设置 cluster-enabled yes |
*最佳实践
- 这是槽迁移的核心命令:先用 CLUSTER COUNTKEYSINSLOT 评估总量,再用 GETKEYSINSLOT 分批获取键名,最后用 MIGRATE 命令迁移
- 每次获取的键数量建议不超过 1000,避免单次迁移阻塞太久
- 迁移流程:获取键名 → MIGRATE 迁移 → 重复直到槽为空 → 执行
CLUSTER SETSLOT ... NODE完成槽所有权转移 - 生产环境建议配合
CLUSTER SETSLOT ... MIGRATING和CLUSTER SETSLOT ... IMPORTING使用,确保迁移期间客户端请求正确转发
*FAQ
Q1: GETKEYSINSLOT 返回的键顺序是固定的吗? A: 不保证固定顺序。每次调用返回的顺序可能不同,但不影响迁移功能。
Q2: count 参数可以无限大吗? A: 不能。count 的上限为 65 536。若槽中键数超过此上限,需要多次调用。
Q3: 迁移过程中新写入的键会被遗漏吗? A: 有可能。在迁移过程中,如果客户端继续向该槽写入新键,这些新键可能不会被 GETKEYSINSLOT 返回。需要在迁移完成后通过 CLUSTER COUNTKEYSINSLOT 确认槽已清空,并处理可能的遗漏键。