@@ -1554,9 +1554,21 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
15541554 )
15551555 }
15561556 slot := c .cmdSlot (cmd , - 1 )
1557- node , err := c .slotReadOnlyNode (state , slot )
1558- if err != nil {
1559- return err
1557+ var node * clusterNode
1558+ // For keyless commands (slot == -1), use ShardPicker if routing policies are enabled
1559+ if slot == - 1 && ! c .opt .DisableRoutingPolicies && c .opt .ShardPicker != nil {
1560+ if len (state .Masters ) == 0 {
1561+ return errClusterNoNodes
1562+ }
1563+ // For read-only keyless commands, pick from all nodes (masters + slaves)
1564+ allNodes := append (state .Masters , state .Slaves ... )
1565+ idx := c .opt .ShardPicker .Next (len (allNodes ))
1566+ node = allNodes [idx ]
1567+ } else {
1568+ node , err = c .slotReadOnlyNode (state , slot )
1569+ if err != nil {
1570+ return err
1571+ }
15601572 }
15611573 cmdsMap .Add (node , cmd )
15621574 }
@@ -1574,9 +1586,19 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
15741586 )
15751587 }
15761588 slot := c .cmdSlot (cmd , - 1 )
1577- node , err := state .slotMasterNode (slot )
1578- if err != nil {
1579- return err
1589+ var node * clusterNode
1590+ // For keyless commands (slot == -1), use ShardPicker if routing policies are enabled
1591+ if slot == - 1 && ! c .opt .DisableRoutingPolicies && c .opt .ShardPicker != nil {
1592+ if len (state .Masters ) == 0 {
1593+ return errClusterNoNodes
1594+ }
1595+ idx := c .opt .ShardPicker .Next (len (state .Masters ))
1596+ node = state .Masters [idx ]
1597+ } else {
1598+ node , err = state .slotMasterNode (slot )
1599+ if err != nil {
1600+ return err
1601+ }
15801602 }
15811603 cmdsMap .Add (node , cmd )
15821604 }
@@ -2198,7 +2220,8 @@ func cmdSlot(cmd Cmder, pos int, prefferedRandomSlot int) int {
21982220 if prefferedRandomSlot != - 1 {
21992221 return prefferedRandomSlot
22002222 }
2201- return hashtag .RandomSlot ()
2223+ // Return -1 for keyless commands to signal that ShardPicker should be used
2224+ return - 1
22022225 }
22032226 firstKey := cmd .stringArg (pos )
22042227 return hashtag .Slot (firstKey )
0 commit comments