首页/数据/Redis 进阶速查/CLUSTER KEYSLOT:键到槽的映射

CLUSTER KEYSLOT:键到槽的映射

CLUSTER KEYSLOT key 返回键所属槽号,按 CRC16(key)%16384 计算并遵循哈希标签规则,用于验证路由与排查跨槽问题。

Redis 进阶速查数据更新于 2026-10-13

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}:profileuser1001标签决定槽号,前缀不影响
{user1001}:ordersuser1001与上例同槽,可参与同一事务或脚本
{a}{b}:xa只认第一对花括号,b 不参与计算
{}:x整个键名空标签等同于没有标签
哈希标签的作用范围只在同一个集群:标签决定键落在哪个槽,从而决定由哪个主节点负责。它是让多键命令、事务与 Lua 脚本在集群中可用的标准手段,也是唯一能在不改客户端的情况下把相关键聚到一起的机制。
标签粒度设计过粗会把集群退化成单机:如果所有键都套上同一个标签,全部数据集中在一个槽并由一个节点承载,其他节点形同虚设,扩容与故障转移失去意义。标签应精确到「需要一起操作的那组键」。

易错点

  • 键名里出现多组花括号却不了解只取第一对,实际槽号与预期不符,多键命令仍然报 CROSSSLOT
  • 用空花括号当标签,等同没加标签,改造后问题依旧,验证时应用 KEYSLOT 实际比对而不是凭感觉
  • 标签只按业务类型划分而不按主体划分,同一主体不同键分到不同槽,事务与脚本都无法使用
  • 看不到槽号分布就规划容量,实际数据集中在少数槽,热点的表现为单节点内存与 CPU 明显偏高

数据来源与参考

  • Redis 官方文档:CLUSTER KEYSLOT 命令与哈希标签
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌