From 8cd57d68535f83c6495423e777f6a30c88cbe0f1 Mon Sep 17 00:00:00 2001 From: xuzhijvn Date: Thu, 24 Apr 2025 15:32:41 +0800 Subject: [PATCH] fix: the loop querying the db in func batchGetCache2 (#3301) --- pkg/common/storage/cache/redis/batch.go | 31 +++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/pkg/common/storage/cache/redis/batch.go b/pkg/common/storage/cache/redis/batch.go index 7f9205bab..93cd66349 100644 --- a/pkg/common/storage/cache/redis/batch.go +++ b/pkg/common/storage/cache/redis/batch.go @@ -76,6 +76,27 @@ func batchGetCache2[K comparable, V any](ctx context.Context, rcClient *rocksCac if err != nil { return nil, err } + values, err := fn(ctx, ids) + if err != nil { + log.ZError(ctx, "batchGetCache query database failed", err, "ids", ids) + return nil, err + } + idToValue := make(map[K]*V) + for _, value := range values { + idToValue[vId(value)] = value + } + getSlotValues := func(slotIds []K) []*V { + if len(slotIds) == 0 { + return nil + } + slotValues := make([]*V, 0, len(slotIds)) + for _, id := range slotIds { + if value, ok := idToValue[id]; ok { + slotValues = append(slotValues, value) + } + } + return slotValues + } result := make([]*V, 0, len(findKeys)) for _, keys := range slotKeys { indexCache, err := rcClient.GetClient().FetchBatch2(ctx, keys, expire, func(idx []int) (map[int]string, error) { @@ -86,16 +107,12 @@ func batchGetCache2[K comparable, V any](ctx context.Context, rcClient *rocksCac idIndex[id] = index queryIds = append(queryIds, id) } - values, err := fn(ctx, queryIds) - if err != nil { - log.ZError(ctx, "batchGetCache query database failed", err, "keys", keys, "queryIds", queryIds) - return nil, err - } - if len(values) == 0 { + slotValues := getSlotValues(queryIds) + if len(slotValues) == 0 { return map[int]string{}, nil } cacheIndex := make(map[int]string) - for _, value := range values { + for _, value := range slotValues { id := vId(value) index, ok := idIndex[id] if !ok {