Skip to content

Commit 2d0d7c5

Browse files
committed
feat: address comments
1 parent 616dd27 commit 2d0d7c5

File tree

1 file changed

+70
-55
lines changed

1 file changed

+70
-55
lines changed

helper.go

Lines changed: 70 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -273,43 +273,52 @@ func arrayToKV(m map[string]RedisMessage, arr []RedisMessage, keys []string) map
273273

274274
func 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

319328
func 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

Comments
 (0)