*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}:nameuser:{1000}:age 都使用 1000 计算哈希,因此落在同一槽。这对多键操作非常有用。

Q3: 如果 key 不包含 {,但有多个 { 怎么办? A: Redis 使用第一个 { 和第一个 } 之间的内容作为 hash tag。如果 } 不存在,则对整个 key 计算哈希。例如 a{b{c} 的 hash tag 是 b{c