CLUSTER KEYSLOT 是什么
CLUSTER KEYSLOT key 返回一个键在集群中所属的槽号,取值范围是 0 到 16383。计算规则是 CRC16 作用于键名后对 16384 取模,但如果键名里包含一对花括号,则只对花括号内的内容计算,这部分内容叫哈希标签。它是设计键命名、验证多键命令能否在集群执行、以及排查跨槽报错时最直接的验证工具,不需要写入任何数据就能得到结论。
基本信息
| 用法 | CLUSTER KEYSLOT key,返回整数槽号 |
|---|---|
| 算法 | CRC16(key) mod 16384 |
| 标签规则 | 只取第一对花括号内的内容参与计算 |
| 边界情况 | 空标签 {} 或不含花括号时按整个键名计算 |
| 配套命令 | CLUSTER COUNTKEYSINSLOT 看槽内现有键数量 |
典型使用场景
- 设计键命名前先验证:确认同一业务主体的多个键加标签后确实落在同一槽
- 排查 CROSSSLOT 报错:逐个查键的槽号,定位是哪一个键没有按约定加标签
- Lua 脚本与事务改造:确认脚本涉及的所有键落在同一槽,否则需要调整键命名
- 容量分布核查:抽样若干标签,观察槽号分布是否均匀,避免大量键挤在少数槽
- 迁移验证:用 COUNTKEYSINSLOT 确认目标槽内还有多少键未迁走
验证槽归属
验证槽归属
redis-cli -p 7000 CLUSTER KEYSLOT user:1001
redis-cli -p 7000 CLUSTER KEYSLOT '{user1001}:profile'
redis-cli -p 7000 CLUSTER KEYSLOT '{user1001}:orders' # 与上一行返回相同槽号
redis-cli -p 7000 CLUSTER KEYSLOT '{user1001}' # 标签本身也单独算一个槽
redis-cli -p 7000 CLUSTER KEYSLOT '{}' # 空标签按整键计算
redis-cli -p 7000 CLUSTER COUNTKEYSINSLOT 1234 # 该槽内键数量键名与槽的关系
| 键名 | 参与计算的部分 | 说明 |
|---|---|---|
| user:1001 | 整个键名 | 无标签,槽号看似随机 |
| {user1001}:profile | user1001 | 标签决定槽号,前缀不影响 |
| {user1001}:orders | user1001 | 与上例同槽,可参与同一事务或脚本 |
| {a}{b}:x | a | 只认第一对花括号,b 不参与计算 |
| {}:x | 整个键名 | 空标签等同于没有标签 |
哈希标签的作用范围只在同一个集群:标签决定键落在哪个槽,从而决定由哪个主节点负责。它是让多键命令、事务与 Lua 脚本在集群中可用的标准手段,也是唯一能在不改客户端的情况下把相关键聚到一起的机制。
标签粒度设计过粗会把集群退化成单机:如果所有键都套上同一个标签,全部数据集中在一个槽并由一个节点承载,其他节点形同虚设,扩容与故障转移失去意义。标签应精确到「需要一起操作的那组键」。