From 79c943f85d18e78fa373ab3316cd8a4b67befa30 Mon Sep 17 00:00:00 2001 From: Lykin <137850705+tiny-craft@users.noreply.github.com> Date: Fri, 24 Nov 2023 00:22:40 +0800 Subject: [PATCH] perf: use ZRangeWithScores to scan partial for ZSet --- backend/services/browser_service.go | 37 ++++++++++++------- .../content_value/ContentValueZSet.vue | 1 + 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/backend/services/browser_service.go b/backend/services/browser_service.go index 27dbe63..2d117cf 100644 --- a/backend/services/browser_service.go +++ b/backend/services/browser_service.go @@ -839,9 +839,10 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS var reset bool var cursor uint64 scanSize := int64(Preferences().GetScanSize()) - var loadedVal []string - if param.Full || matchPattern != "*" { + doFilter := matchPattern != "*" + if param.Full || doFilter { // load all + var loadedVal []string cursor, reset = 0, true for { loadedVal, cursor, err = client.ZScan(ctx, key, cursor, matchPattern, scanSize).Result() @@ -872,18 +873,26 @@ func (b *browserService) GetKeyDetail(param types.KeyDetailParam) (resp types.JS } else { cursor, _, reset = getEntryCursor() } - loadedVal, cursor, err = client.ZScan(ctx, key, cursor, matchPattern, scanSize).Result() - loadedLen := len(loadedVal) - items = make([]types.ZSetEntryItem, loadedLen/2) - var score float64 - for i := 0; i < loadedLen; i += 2 { - if score, err = strconv.ParseFloat(loadedVal[i+1], 64); err == nil { - items[i/2].Score = score - items[i/2].Value = loadedVal[i] - if doConvert { - if dv, _, _ := strutil.ConvertTo(loadedVal[i], param.Decode, param.Format); dv != loadedVal[i] { - items[i/2].DisplayValue = dv - } + var loadedVal []redis.Z + loadedVal, err = client.ZRangeWithScores(ctx, key, int64(cursor), int64(cursor)+scanSize-1).Result() + cursor = cursor + uint64(scanSize) + if len(loadedVal) < int(scanSize) { + cursor = 0 + } + + items = make([]types.ZSetEntryItem, 0, len(loadedVal)) + for _, z := range loadedVal { + val := strutil.AnyToString(z.Score, "", 0) + if doFilter && !strings.Contains(val, param.MatchPattern) { + continue + } + items = append(items, types.ZSetEntryItem{ + Score: z.Score, + Value: val, + }) + if doConvert { + if dv, _, _ := strutil.ConvertTo(val, param.Decode, param.Format); dv != val { + items[len(items)-1].DisplayValue = dv } } } diff --git a/frontend/src/components/content_value/ContentValueZSet.vue b/frontend/src/components/content_value/ContentValueZSet.vue index 78ef795..a9e307b 100644 --- a/frontend/src/components/content_value/ContentValueZSet.vue +++ b/frontend/src/components/content_value/ContentValueZSet.vue @@ -85,6 +85,7 @@ const scoreColumn = computed(() => ({ align: 'center', titleAlign: 'center', resizable: true, + sorter: (row1, row2) => row1.s - row2.s, // filterOptionValue: scoreFilterOption.value, // filter(value, row) { // const score = parseFloat(row.s)