按槽取键名
Redis Cluster 用 16384 个槽做数据归属,运维时经常需要知道「某个槽里到底有哪些键」。CLUSTER GETKEYSINSLOT 按槽返回至多 count 个键名,用于抽样校验、分批迁移与容量估算;它只返回键名,不会返回键值。
基本信息
| 语法 | CLUSTER GETKEYSINSLOT <slot> <count> |
|---|---|
| 返回 | 该槽内的键名数组,最多 count 个 |
| 版本 | Redis 3.0 起(集群模式) |
| 执行节点 | 需连到持有该槽的节点,否则只会拿到重定向或空结果 |
典型使用场景
- 迁移前抽样看槽内键名规律,确认这批数据属于哪个业务
- 写迁移脚本时按批取键,再逐个 MIGRATE 到目标节点
- 配合 CLUSTER COUNTKEYSINSLOT 估算还要循环几轮才能取完
- 排查热点时按槽取样,观察键名是否有明显倾斜特征
- 验证 hash tag 是否把同一业务的多个键收敛到同一个槽
取样与迁移流程
取样与迁移流程
# 看槽 1234 内前 10 个键名(只给键名,不含值)
redis-cli -p 7000 CLUSTER GETKEYSINSLOT 1234 10
# 该槽键总数,用来判断循环是否结束
redis-cli -p 7000 CLUSTER COUNTKEYSINSLOT 1234
# 迁移中先把槽标记为迁出,客户端访问会被重定向
redis-cli -p 7000 CLUSTER SETSLOT 1234 MIGRATING <目标节点ID>
# 逐批迁移键,KEYS 语法下键名位置传空字符串
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 "" 0 5000 KEYS user:1 user:2配套命令读法
| 项 | 含义 | 注意点 |
|---|---|---|
| GETKEYSINSLOT | 返回至多 count 个键名 | count 必须是正整数 |
| COUNTKEYSINSLOT | 该槽当前键总数 | 用于估算循环次数 |
| SETSLOT MIGRATING/IMPORTING | 标记槽正在迁出或迁入 | 迁移前先设置,收尾后清除 |
| SETSLOT NODE | 把槽正式交给目标节点 | 以这一步作为迁移完成判据 |
| MIGRATE | 把键搬到目标实例 | 返回 NOKEY 表示键已不在源端 |
两次调用之间键可能新增或过期,所以「取一批迁一批」要循环到 COUNTKEYSINSLOT 归零,最后用 CLUSTER SETSLOT 收尾,而不是以某一轮取到的键为准。
同一槽内的键名返回顺序不保证稳定,脚本不要依赖顺序做增量处理,用「取一批、处理一批、取到空为止」的循环最稳;返回空数组说明该槽已经没有键。
count 给成几万会让单条命令返回海量键名并长时间占用连接,生产上按几百个一批更稳妥,配合脚本循环处理。