我是一个Redis集群 - 3个主人和3个奴隶。该群集包含~300个键(foo0 - foo300)。据我所知,每个主服务器负责某些数据子集,并且可以将客户端重定向到具有MOVED错误的正确节点。
但是,如果我向主人发送GET 不存在键(例如 klsdkaso , qwerty123 ...)的请求,我也获得了MOVED到另一个节点。我很困惑。谁可以解释为什么这样?
答案 0 :(得分:3)
为了说清楚,让我们定义两种主节点:
GET
命令。因为已连接节点仅包含广告位映射信息,即给定密钥应该位于目标节点上。但是,不会知道目标节点上是否存在给定密钥。
因此已连接节点必须首先将客户端重定向到目标节点,即使用MOVED
错误消息提供有关IP和端口的信息目标节点。然后,客户端向目标节点发送另一个GET
命令,以检查给定密钥是否确实存在。
答案 1 :(得分:3)
密钥,无论它是否实际存在,都是通过将其名称(或其部分,a.k.a标记)散列到一个槽来映射的。将插槽分配给主人,并且主人首先检查关键字"归属"它(根据当前的时隙范围分配),然后才执行任何其他操作。