*Redis CLUSTER KEYSLOT 命令
CLUSTER KEYSLOT 返回指定 key 的哈希槽编号,用于判断 key 在集群中的存储位置。
*语法
CLUSTER KEYSLOT key
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 要计算哈希槽的键名 |
*返回值
- Integer:该 key 对应的哈希槽编号,范围 0 ~ 16383。
*时间复杂度
O(N),其中 N 为 key 的字节长度。
*示例
*计算普通键的哈希槽
> CLUSTER KEYSLOT mykey
(integer) 14687
*包含 hash tag 的键
> CLUSTER KEYSLOT user:{1000}:name
(integer) 5798
> CLUSTER KEYSLOT user:{1000}:age
(integer) 5798
*验证多键是否在同一槽
> CLUSTER KEYSLOT order:1000
(integer) 5798
> CLUSTER KEYSLOT order:1001
(integer) 1024
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 key 参数 | 补充键名 |
| ERR This instance has cluster support disabled | 未启用集群模式 | 在 redis.conf 中设置 cluster-enabled yes |
*最佳实践
- 使用 hash tag(
{...})将相关业务 key 映射到同一槽,确保多键操作(如 MGET、事务、Lua 脚本)可以在同一节点执行 - 客户端连接集群时,可通过此命令确认 key 的路由目标,验证客户端库的路由逻辑是否正确
- 槽迁移规划时,可用此命令判断哪些 key 会落在待迁移的槽中
- 注意:Redis Cluster 的槽计算算法使用 CRC16(key) mod 16384。如果 key 包含
{...},只对{}内的内容计算哈希
*FAQ
Q1: 同一个 key 在不同集群中的哈希槽一样吗? A: 一样。哈希槽计算仅基于键名本身,与集群配置无关。同一键名在任何 Redis Cluster 中都映射到相同的槽编号。
Q2: hash tag 是什么?怎么用?
A: 在键名中使用 {...} 包裹部分字符串,Redis 只对该部分内容计算哈希。例如 user:{1000}:name 和 user:{1000}:age 都使用 1000 计算哈希,因此落在同一槽。这对多键操作非常有用。
Q3: 如果 key 不包含 {,但有多个 { 怎么办?
A: Redis 使用第一个 { 和第一个 } 之间的内容作为 hash tag。如果 } 不存在,则对整个 key 计算哈希。例如 a{b{c} 的 hash tag 是 b{c。