@@ -273,43 +273,52 @@ func arrayToKV(m map[string]RedisMessage, arr []RedisMessage, keys []string) map
273273
274274func clusterMGet (client Client , ctx context.Context , keys []string ) (ret map [string ]RedisMessage , err error ) {
275275 ret = make (map [string ]RedisMessage , len (keys ))
276- slotCount := make (map [uint16 ]int , len (keys )/ 2 )
276+ if len (keys ) == 0 {
277+ return ret , nil
278+ }
279+
280+ slotIdx := make (map [uint16 ]int , len (keys )/ 2 )
281+ var builders []any
277282 for _ , key := range keys {
278- slotCount [slot (key )]++
283+ s := slot (key )
284+ idx , ok := slotIdx [s ]
285+ if ! ok {
286+ idx = len (builders )
287+ slotIdx [s ] = idx
288+ builders = append (builders , client .B ().Mget ())
289+ }
290+ switch b := builders [idx ].(type ) {
291+ case intl.Mget :
292+ builders [idx ] = b .Key (key )
293+ case intl.MgetKey :
294+ builders [idx ] = b .Key (key )
295+ }
279296 }
280- cmds := mgetcmdsp .Get (0 , len (slotCount ))
297+
298+ cmds := mgetcmdsp .Get (0 , len (builders ))
281299 defer mgetcmdsp .Put (cmds )
282- for s := range slotCount {
283- var builder any = client .B ().Mget ()
284- var first = true
285- for _ , key := range keys {
286- if slot (key ) == s {
287- if first {
288- builder = builder .(intl.Mget ).Key (key )
289- first = false
290- } else {
291- builder = builder .(intl.MgetKey ).Key (key )
292- }
293- }
294- }
295- cmds .s = append (cmds .s , builder .(intl.MgetKey ).Build ().Pin ())
300+ cmds .s = cmds .s [:len (builders )]
301+ for i , b := range builders {
302+ cmds .s [i ] = b .(intl.MgetKey ).Build ().Pin ()
296303 }
304+
297305 resps := client .DoMulti (ctx , cmds .s ... )
298306 defer resultsp .Put (& redisresults {s : resps })
307+
299308 for i , resp := range resps {
300- arr , err : = resp .ToArray ()
309+ builders [ i ] , err = resp .ToArray ()
301310 if err != nil {
302311 return nil , err
303312 }
304- s := cmds .s [i ].Slot ()
305- var j int
306- for _ , key := range keys {
307- if slot (key ) == s {
308- ret [key ] = arr [j ]
309- j ++
310- }
311- }
312313 }
314+
315+ pos := make ([]int , len (builders ))
316+ for _ , key := range keys {
317+ idx := slotIdx [slot (key )]
318+ ret [key ] = builders [idx ].([]RedisMessage )[pos [idx ]]
319+ pos [idx ]++
320+ }
321+
313322 for i := range cmds .s {
314323 intl .PutCompletedForce (cmds .s [i ])
315324 }
@@ -318,46 +327,52 @@ func clusterMGet(client Client, ctx context.Context, keys []string) (ret map[str
318327
319328func clusterJsonMGet (client Client , ctx context.Context , keys []string , path string ) (ret map [string ]RedisMessage , err error ) {
320329 ret = make (map [string ]RedisMessage , len (keys ))
321- slotCount := make (map [uint16 ]int , len (keys )/ 2 )
322- for _ , key := range keys {
323- slotCount [slot (key )]++
324- }
325- if len (slotCount ) == 0 {
330+ if len (keys ) == 0 {
326331 return ret , nil
327332 }
328- cmds := mgetcmdsp .Get (0 , len (slotCount ))
329- defer mgetcmdsp .Put (cmds )
330- for s := range slotCount {
331- var builder any = client .B ().JsonMget ()
332- var first = true
333- for _ , key := range keys {
334- if slot (key ) == s {
335- if first {
336- builder = builder .(intl.JsonMget ).Key (key )
337- first = false
338- } else {
339- builder = builder .(intl.JsonMgetKey ).Key (key )
340- }
341- }
333+
334+ slotIdx := make (map [uint16 ]int , len (keys )/ 2 )
335+ var builders []any
336+ for _ , key := range keys {
337+ s := slot (key )
338+ idx , ok := slotIdx [s ]
339+ if ! ok {
340+ idx = len (builders )
341+ slotIdx [s ] = idx
342+ builders = append (builders , client .B ().JsonMget ())
343+ }
344+ switch b := builders [idx ].(type ) {
345+ case intl.JsonMget :
346+ builders [idx ] = b .Key (key )
347+ case intl.JsonMgetKey :
348+ builders [idx ] = b .Key (key )
342349 }
343- cmds .s = append (cmds .s , builder .(intl.JsonMgetKey ).Path (path ).Build ().Pin ())
344350 }
351+
352+ cmds := mgetcmdsp .Get (0 , len (builders ))
353+ defer mgetcmdsp .Put (cmds )
354+ cmds .s = cmds .s [:len (builders )]
355+ for i , b := range builders {
356+ cmds .s [i ] = b .(intl.JsonMgetKey ).Path (path ).Build ().Pin ()
357+ }
358+
345359 resps := client .DoMulti (ctx , cmds .s ... )
346360 defer resultsp .Put (& redisresults {s : resps })
361+
347362 for i , resp := range resps {
348- arr , err : = resp .ToArray ()
363+ builders [ i ] , err = resp .ToArray ()
349364 if err != nil {
350365 return nil , err
351366 }
352- s := cmds .s [i ].Slot ()
353- var j int
354- for _ , key := range keys {
355- if slot (key ) == s {
356- ret [key ] = arr [j ]
357- j ++
358- }
359- }
360367 }
368+
369+ pos := make ([]int , len (builders ))
370+ for _ , key := range keys {
371+ idx := slotIdx [slot (key )]
372+ ret [key ] = builders [idx ].([]RedisMessage )[pos [idx ]]
373+ pos [idx ]++
374+ }
375+
361376 for i := range cmds .s {
362377 intl .PutCompletedForce (cmds .s [i ])
363378 }
0 commit comments