1. 如何选择节点
1.1. 确定slot
1.1.1. 通过cmdSlot
方法确定在哪个槽上, 这一步只是本地计算
首先入口方法_process,先通过cmdSlot
方法用key计算此次应该落在哪个槽上
通过
crc16sum
算法计算key应该属于哪个槽,slotNumber为16384
func Slot(key string) int {
if key == "" {
return RandomSlot()
}
key = Key(key)
return int(crc16sum(key)) % slotNumber
}
1.2. 选取节点的核心方法
1.2.1. cmdNode内部实现
1.2.2. slotReadOnlyNode方法实现
func (c *ClusterClient) slotReadOnlyNode(state *clusterState, slot int) (*clusterNode, error) {
if c.opt.RouteByLatency {
return state.slotClosestNode(slot)
}
if c.opt.RouteRandomly {
return state.slotRandomNode(slot)
}
return state