diff --git a/pkg/localcache/lru/lru_lazy.go b/pkg/localcache/lru/lru_lazy.go index f44722999..942773ed6 100644 --- a/pkg/localcache/lru/lru_lazy.go +++ b/pkg/localcache/lru/lru_lazy.go @@ -88,11 +88,50 @@ func (x *LayLRU[K, V]) Get(key K, fetch func() (V, error)) (V, error) { return v.value, v.err } -func (x *LayLRU[K, V]) GetBatch(keys []K, fetch func() ([]V, error)) ([]V, error) { - return nil, nil +func (x *LayLRU[K, V]) GetBatch(keys []K, fetch func(keys []K) (map[K]V, error)) ([]V, error) { + x.lock.Lock() + res := make([]V, 0) + queries := make([]K, 0) + setVs := make(map[K]*layLruItem[V]) + for _, key := range keys { + v, ok := x.core.Get(key) + if ok { + x.lock.Unlock() + v.lock.Lock() + expires, value, _ := v.expires, v.value, v.err + if expires != 0 && expires > time.Now().UnixMilli() { + v.lock.Unlock() + x.target.IncrGetHit() + res = append(res, value) + continue + } + } + queries = append(queries, key) + x.lock.Unlock() + } + values, err := fetch(queries) + for key, val := range values { + v := &layLruItem[V]{} + v.value = val + + if err == nil { + v.expires = time.Now().Add(x.successTTL).UnixMilli() + x.target.IncrGetSuccess() + } else { + v.expires = time.Now().Add(x.failedTTL).UnixMilli() + x.target.IncrGetFailed() + } + setVs[key] = v + x.lock.Lock() + x.core.Add(key, v) + x.lock.Unlock() + res = append(res, val) + } + + return res, err } -func (x *LayLRU[K, V]) SetHasBatch(data map[K]V) bool { +func (x *LayLRU[K, V]) SetBatch(data map[K]V) bool { x.lock.Lock() defer x.lock.Unlock() for key, value := range data { diff --git a/pkg/rpccache/online.go b/pkg/rpccache/online.go index ec49c886d..640e95d1b 100644 --- a/pkg/rpccache/online.go +++ b/pkg/rpccache/online.go @@ -145,6 +145,7 @@ func (o *OnlineCache) GetUserOnline(ctx context.Context, userID string) (bool, e } func (o *OnlineCache) GetUsersOnline(ctx context.Context, usersID []string) ([]string, []string, error) { + t := time.Now() var ( onlineUserIDS []string offlineUserIDs []string @@ -162,7 +163,7 @@ func (o *OnlineCache) GetUsersOnline(ctx context.Context, usersID []string) ([]s case false: } - log.ZWarn(ctx, "get users online", nil, "online users length", len(onlineUserIDS), "offline users length", len(offlineUserIDs)) + log.ZWarn(ctx, "get users online", nil, "online users length", len(onlineUserIDS), "offline users length", len(offlineUserIDs), "cost", time.Since(t)) return onlineUserIDS, offlineUserIDs, nil }