直接回答:Redis Cluster 把 key 空间固定分为 16384 个哈希槽(CRC16(key) mod 16384),槽是分片与迁移的最小单位,每个节点负责一段槽区间。扩容/缩容就是槽的重新指派与搬迁;客户端拿到 MOVED 重定向后更新槽位映射。相比一致性哈希的隐式分布,槽位是显式编排的:哪个槽在哪个节点是明确状态,运维可控、迁移可追踪,Gossip 协议传播槽映射和节点健康。
展开解析:为什么 16384 而不是 65536:心跳包携带槽位摘要,16384 用 2KB bitmap 就够,节点数实际很少超千,够用且省带宽。运维要点:多 key 操作(MGET、Lua)要求 key 同槽,用 hash tag({user1}.orders 只哈希花括号部分)强制共置;迁移期间 ASK 转向处理半迁移状态的读;主从异步复制意味着主挂掉切换时可能丢少量写——Cluster 是 AP 取向,强一致场景别硬用。槽位设计的推论:节点数上限实用约千级;rebalance 会迁移数据产生流量高峰,大 value 场景要控制迁移速度;客户端要支持 Cluster 协议(智能客户端缓存槽表),代理层方案(Codis/Twemproxy 思路)则用固定槽映射换客户端透明。
追问方向:MOVED 与 ASK 的区别?为什么 Cluster 不支持多数据库(select)?脑裂场景 Cluster 如何表现?
(约 450 字)