func (c *ClusterClient) Watch(fn func(*Tx) error, keys ...string) error { node, err := c.slotMasterNode(hashtag.Slot(keys[0])) if err != nil { return err } return node.Client.Watch(fn, keys...) }
func (c *ClusterClient) cmdSlotAndNode(cmd Cmder) (int, *clusterNode, error) { cmdInfo := c.cmdInfo(cmd.arg(0)) if cmdInfo == nil { internal.Logf("info for cmd=%s not found", cmd.arg(0)) node, err := c.randomNode() return 0, node, err } if cmdInfo.FirstKeyPos == -1 { node, err := c.randomNode() return 0, node, err } firstKey := cmd.arg(int(cmdInfo.FirstKeyPos)) slot := hashtag.Slot(firstKey) if cmdInfo.ReadOnly && c.opt.ReadOnly { if c.opt.RouteByLatency { node, err := c.slotClosestNode(slot) return slot, node, err } node, err := c.slotSlaveNode(slot) return slot, node, err } node, err := c.slotMasterNode(slot) return slot, node, err }