标准答案

  1. 每个 Key 会按哈希映射到一个槽位,再由某个主节点负责;扩容或缩容时迁移的是槽位及其 Key,不是任意按业务表拆分。
  2. 跨槽位的多 Key 命令、事务和 Lua 脚本通常受限。确实需要同槽原子操作的 Key 可使用相同 hash tag,例如 order:{123}:status 与 order:{123}:items。
  3. hash tag 应只放真正需要绑定的业务维度;把所有 Key 固定到同一个 tag 会让分片失效,形成热点节点。
  4. 客户端必须使用支持 Cluster 重定向、拓扑刷新和故障切换的驱动,并对迁槽、短暂重试和连接池行为做压测。

题目解析

分片约束会反推数据模型。若一个操作需要频繁跨用户、跨订单做事务式集合运算,Redis Cluster 不是让它自动保持原子性的理由,可能需要调整边界或回到数据库事务。

Key 设计还应兼顾租户与热点。按单租户 hash tag 可能便利了原子操作,却会让大租户独占一个分片,需要根据实际分布做二级分散。

代码示例

同一对花括号中的内容参与 hash tag,以下两个 Key 可以落到同一槽位。

Text
cart:{user-1001}:items
cart:{user-1001}:version
cart:{user-1002}:items

常见误区

  • 把所有业务 Key 都放进同一个 hash tag,导致 Cluster 退化成单分片。
  • 在跨槽位场景直接依赖多 Key 原子命令,却没有验证客户端和命令限制。

作者信息