首页/数据/数据库速查/Hash Tag 同槽技巧({} 包裹)
Redis 运维与场景124 条

Hash Tag 同槽技巧({} 包裹)

用 {} 指定哈希部分:只有花括号内参与 CRC16 计算,user:{88}:name 与 user:{88}:cart 一定同槽,从而支持 MGET/事务/Lua。

数据库速查数据更新于 2026-10-13

哈希标签是什么

集群按哈希槽分片,同一个槽上的键才能参与多键操作。默认只有键名整体参与计算,不同键名通常落在不同槽;用花括号包住一部分键名后,只有括号内的内容参与计算,形如 user:{88}:name 与 user:{88}:cart 就一定会落在同一槽。

基本信息

语法键名中的 {标签},只有标签内容参与哈希计算
计算函数对标签内容做 CRC16 再对 16384 取模得到槽号
多键要求批量读写、事务与脚本中的所有键必须同槽
验证命令CLUSTER KEYSLOT 键名,查看键落在哪个槽
代价标签选择不均会让某个槽压力集中,形成热点

典型使用场景

  • 用户维度多键读写:把同一用户的对象用同一标签包起来,支持批量取
  • 事务与脚本:集群下事务只能操作同槽键,标签是必要前提
  • 计数与明细同槽:汇总键与明细键设计成同标签,便于原子操作
  • 批量查询优化:把多个键聚到同槽,一次批量命令即可完成
  • 迁移规划:同槽键会一起迁移,标签粒度决定了迁移的影响范围

示例

示例
redis-cli -c CLUSTER KEYSLOT user:88:name      # 单个键的槽号
redis-cli -c CLUSTER KEYSLOT user:1001:name    # 不同用户通常不同槽
# 加上哈希标签后必然同槽
redis-cli -c CLUSTER KEYSLOT user:{88}:name
redis-cli -c CLUSTER KEYSLOT user:{88}:cart
# 同槽即可批量操作
redis-cli -c MSET user:{88}:name 张三 user:{88}:city 上海
redis-cli -c MGET user:{88}:name user:{88}:city
# 跨槽操作会报错示例(错误信息含 CROSSSLOT)
redis-cli -c MGET user:88:name user:99:name

标签设计对照

设计结果评价
user:{88}:name同一用户的所有键同槽推荐,粒度适中
cache:{fixed}:name全部键集中到一个槽不推荐,集群退化为单机
user:88:name按整体键名散列无法做多键操作
{88}:name 与 {88}:cart标签相同即同槽标签内容才是关键
标签的选择要能分散:用用户编号这类天然分散的字段,避免用固定字符串把全部键压到一个槽上。
只有第一个花括号生效:键名中出现多对花括号时,空标签或非法标签会导致按整体键名计算,多键操作仍会报跨槽错误。

易错点

  • 标签用固定字符串:所有键挤在一个槽上,集群失去分片意义
  • 标签粒度太粗:热点用户所在槽压力集中,其他节点闲着
  • 键名里出现空花括号:按整体键名计算,多键操作依旧报跨槽错误
  • 设计完不验证槽号:以为同槽却实际不同,线上才暴露批量操作失败

数据来源与参考

  • Redis 官方文档: Cluster 规范(Hash tags)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌