Files
open-im-server/pkg/common/db/cache/rockscache.go
T

85 lines
1.9 KiB
Go
Raw Normal View History

2023-01-16 20:14:26 +08:00
package cache
2022-07-14 12:08:28 +08:00
import (
2022-07-20 15:49:21 +08:00
"Open_IM/pkg/utils"
2022-07-20 11:35:19 +08:00
"context"
2022-07-14 12:08:28 +08:00
"encoding/json"
2023-02-10 15:46:29 +08:00
"github.com/dtm-labs/rockscache"
2022-07-14 12:08:28 +08:00
"time"
)
2023-01-16 20:14:26 +08:00
const scanCount = 3000
2023-02-10 15:46:29 +08:00
2023-01-16 20:14:26 +08:00
func (rc *RcClient) DelKeys() {
2023-01-31 18:55:22 +08:00
for _, key := range []string{"GROUP_CACHE:", "FRIEND_RELATION_CACHE", "BLACK_LIST_CACHE:", "USER_INFO_CACHE:", "GROUP_INFO_CACHE", groupOwnerIDCache, joinedGroupListCache,
groupMemberInfoCache, groupAllMemberInfoCache, "ALL_FRIEND_INFO_CACHE:"} {
2022-07-26 15:16:46 +08:00
fName := utils.GetSelfFuncName()
2022-07-20 11:35:19 +08:00
var cursor uint64
var n int
for {
var keys []string
var err error
2023-01-16 20:14:26 +08:00
keys, cursor, err = rc.rdb.Scan(context.Background(), cursor, key+"*", scanCount).Result()
2022-07-20 11:35:19 +08:00
if err != nil {
panic(err.Error())
}
n += len(keys)
2022-07-29 14:36:07 +08:00
// for each for redis cluster
2022-07-26 15:16:46 +08:00
for _, key := range keys {
2023-01-16 20:14:26 +08:00
if err = rc.rdb.Del(context.Background(), key).Err(); err != nil {
2022-07-26 15:16:46 +08:00
log.NewError("", fName, key, err.Error())
2023-01-16 20:14:26 +08:00
err = rc.rdb.Del(context.Background(), key).Err()
2022-07-26 15:16:46 +08:00
if err != nil {
panic(err.Error())
}
2022-07-20 12:08:58 +08:00
}
2022-07-20 12:05:57 +08:00
}
2022-07-20 11:35:19 +08:00
if cursor == 0 {
break
}
}
}
}
2023-02-10 15:46:29 +08:00
func GetCache[T any](ctx context.Context, rcClient *rockscache.Client, key string, expire time.Duration, fn func(ctx context.Context) (T, error)) (T, error) {
var t T
var write bool
v, err := rcClient.Fetch(key, expire, func() (s string, err error) {
t, err = fn(ctx)
if err != nil {
return "", err
}
bs, err := json.Marshal(t)
if err != nil {
return "", utils.Wrap(err, "")
}
write = true
return string(bs), nil
})
if err != nil {
return t, err
}
if write {
return t, nil
}
err = json.Unmarshal([]byte(v), &t)
if err != nil {
return t, utils.Wrap(err, "")
}
return t, nil
}
func GetCacheFor[E any, T any](ctx context.Context, list []E, fn func(ctx context.Context, item E) (T, error)) ([]T, error) {
rs := make([]T, 0, len(list))
for _, e := range list {
r, err := fn(ctx, e)
if err != nil {
return nil, err
}
rs = append(rs, r)
}
return rs, nil
}