|
|
|
package cache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"Open_IM/pkg/utils"
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"github.com/dtm-labs/rockscache"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
const scanCount = 3000
|
|
|
|
|
|
|
|
//func (rc *RcClient) DelKeys() {
|
|
|
|
// 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:"} {
|
|
|
|
// fName := utils.GetSelfFuncName()
|
|
|
|
// var cursor uint64
|
|
|
|
// var n int
|
|
|
|
// for {
|
|
|
|
// var keys []string
|
|
|
|
// var err error
|
|
|
|
// keys, cursor, err = rc.rdb.Scan(context.Background(), cursor, key+"*", scanCount).Result()
|
|
|
|
// if err != nil {
|
|
|
|
// panic(err.Error())
|
|
|
|
// }
|
|
|
|
// n += len(keys)
|
|
|
|
// // for each for redis cluster
|
|
|
|
// for _, key := range keys {
|
|
|
|
// if err = rc.rdb.Del(context.Background(), key).Err(); err != nil {
|
|
|
|
// log.NewError("", fName, key, err.Error())
|
|
|
|
// err = rc.rdb.Del(context.Background(), key).Err()
|
|
|
|
// if err != nil {
|
|
|
|
// panic(err.Error())
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// if cursor == 0 {
|
|
|
|
// break
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|