fix:get max seqs

This commit is contained in:
icey-yu 2024-07-01 18:50:26 +08:00
parent 04a5c97e31
commit e595bb0230

View File

@ -22,6 +22,7 @@ import (
"github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/errs"
"github.com/openimsdk/tools/utils/stringutil" "github.com/openimsdk/tools/utils/stringutil"
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"sync"
) )
func NewSeqCache(rdb redis.UniversalClient) cache.SeqCache { func NewSeqCache(rdb redis.UniversalClient) cache.SeqCache {
@ -62,17 +63,21 @@ func (c *seqCache) getSeq(ctx context.Context, conversationID string, getkey fun
func (c *seqCache) getSeqs(ctx context.Context, items []string, getkey func(s string) string) (m map[string]int64, err error) { func (c *seqCache) getSeqs(ctx context.Context, items []string, getkey func(s string) string) (m map[string]int64, err error) {
m = make(map[string]int64, len(items)) m = make(map[string]int64, len(items))
var lock sync.Mutex
keys := make([]string, len(items)) keys := make([]string, len(items))
for i, v := range items { for i, v := range items {
keys[i] = getkey(v) keys[i] = getkey(v)
} }
manager := NewRedisShardManager(c.rdb)
if err = manager.ProcessKeysBySlot(ctx, keys, func(ctx context.Context, _ int64, keys []string) error {
res, err := c.rdb.MGet(ctx, keys...).Result() res, err := c.rdb.MGet(ctx, keys...).Result()
if err != nil && !errors.Is(err, redis.Nil) { if err != nil && !errors.Is(err, redis.Nil) {
return nil, errs.Wrap(err) return errs.Wrap(err)
} }
// len(res) == len(items) // len(res) <= len(items)
for i := range res { for i := range res {
strRes, ok := res[i].(string) strRes, ok := res[i].(string)
if !ok { if !ok {
@ -80,9 +85,16 @@ func (c *seqCache) getSeqs(ctx context.Context, items []string, getkey func(s st
} }
val := stringutil.StringToInt64(strRes) val := stringutil.StringToInt64(strRes)
if val != 0 { if val != 0 {
lock.Lock()
m[items[i]] = val m[items[i]] = val
lock.Unlock()
} }
} }
return nil
}); err != nil {
return nil, err
}
return m, nil return m, nil
} }