CLUSTER KEYSLOT 命令直接返回 key 对应的槽号,如 CLUSTER KEYSLOT "user:1001" 返回 12345;它仅支持单个 key,自动处理哈希标签 {},不返回节点地址,且仅在集群模式下可用。
CLUSTER KEYSLOT 命令查槽位最直接
想快速知道某个 key 落在哪个槽,不用写代码、不依赖客户端逻辑,直接连上任意一个 Redis Cluster 节点执行:CLUSTER KEYSLOT <key>。比如:CLUSTER KEYSLOT "user:1001" 返回 12345,就说明这个 key 映射到 12345 号槽。
注意:该命令只接受单个 key,不支持通配符或多个 key;如果 key 包含哈希标签(如 {user:1001}:profile),它会自动提取 {} 内的内容参与计算,结果和 {user:1001}:settings 一致——这是保证多 key 操作能路由到同一节点的关键机制。
常见误判点:
- 误以为
CLUSTER KEYSLOT会返回节点地址——它只返回槽号,查节点要靠CLUSTER SLOTS或客户端本地缓存的映射表 - 在非集群模式下执行该命令会报错
(error) ERR This instance has cluster support disabled
crc16(key) % 16384 是硬编码规则,不可自定义
Redis Cluster 的槽计算不是配置项,而是强制实现:对 key 字符串做 CRC16 校验,再对 16384 取模(等价于 crc16(key) & 16383,位与更快)。所有官方客户端(redis-py、lettuce、StackExchange.Redis)都内置此逻辑,你无法绕过或替换为其他哈希算法。
这意味着:
- 同一个 key 在任何 Redis Cluster 环境中永远落在同一个 slot,跨集群迁移数据时无需重哈希
- 手动实现 slot 计算时,必须用标准 CRC16(非 MD5、SHA1 或 Python 的
hash()),否则结果错位导致 MOVED 错误 - 某些语言的 CRC16 实现有字节序或初始值差异(如 Java 的
CRC32类默认是 32 位),需确认是否输出 16 位无符号整数
MOVED 错误不是失败,而是路由重定向信号
当你直连某个节点(比如 127.0.0.1:7000)执行 GET user:1001,而该 key 实际属于 127.0.0.1:7002 时,你会收到类似这样的响应:MOVED 12345 127.0.0.1:7002。
这不是操作失败,而是集群在告诉你:“这个 key 在 12345 槽,由 7002 节点负责,请重试”。客户端应:
- 解析错误中的槽号和目标地址
- 更新本地缓存的 slot → node 映射表(避免下次重复跳转)
- 将原请求转发到新地址
如果你用的是基础 TCP 连接或未开启集群模式的客户端(如 redis-cli 默认不走集群协议),就会卡在这里反复报错;务必确认客户端已启用集群支持(例如 redis-cli -c 启动)。
哈希标签 {} 是唯一可控的“绑定”手段
omega1.swatchsh.com
rolex1.swatchsh.com
patek1.swatchsh.com
omegawx.paydyj.com
rolexwx.paydyj.com
patekwx.paydyj.com
omegawx.watchku.com
rolexwx.watchku.com
patekwx.watchku.com
omegawx.sitezj.cn
rolexwx.sitezj.cn
patekwx.sitezj.cn
omegawx.sepis.com.cn
rolexwx.sepis.com.cn
patekwx.sepis.com.cn
Redis 不允许你指定 slot 或强制把 key 分配到某节点,但提供了一个隐式控制方式:哈希标签。只要两个 key 共享相同的 {xxx} 内容,它们就必然落在同一 slot。
例如:
SET {order:123}:items "a,b,c"HSET {order:123}:status state "shipped"EXPIRE {order:123}:lock 60
这三个 key 都只取 order:123 计算 slot,因此可安全地在 Lua 脚本中一起读写,不会触发 CROSSSLOT 错误。
注意边界:
- {} 最多只能有一对,嵌套无效(
{{user:1}}:name中实际提取的是{user:1,因第一个}就终止了) - {} 之外的字符完全忽略,
user:{123}:name和cache:{123}:meta会落到同一 slot,但user:123:name则按完整字符串计算 - 没有 {} 的 key,整个字符串参与 CRC16 计算,长 key 会导致轻微性能开销
真正容易被忽略的,是 slot 分配表的更新时机:它不是实时全网广播,而是通过 Gossip 协议异步传播。节点刚完成 resharding 后,部分客户端可能还在用旧的 slot 表,导致短暂 MOVED 或 ASK 重定向。别急着重启客户端,等几秒或主动执行 CLUSTER NODES 触发同步更稳妥。