哈希标签是什么
集群按哈希槽分片,同一个槽上的键才能参与多键操作。默认只有键名整体参与计算,不同键名通常落在不同槽;用花括号包住一部分键名后,只有括号内的内容参与计算,形如 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 | 标签相同即同槽 | 标签内容才是关键 |
标签的选择要能分散:用用户编号这类天然分散的字段,避免用固定字符串把全部键压到一个槽上。
只有第一个花括号生效:键名中出现多对花括号时,空标签或非法标签会导致按整体键名计算,多键操作仍会报跨槽错误。