From c9193302a83dccb760febba742f5946c0897ad20 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Mon, 15 Jan 2024 15:53:40 +0800 Subject: [PATCH] feat: local cache --- internal/rpc/msg/verify.go | 14 ++++++------- pkg/localcache/option.go | 9 --------- pkg/rpccache/group.go | 41 +++++++++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/internal/rpc/msg/verify.go b/internal/rpc/msg/verify.go index e316ef88d..9f6ca727a 100644 --- a/internal/rpc/msg/verify.go +++ b/internal/rpc/msg/verify.go @@ -95,13 +95,13 @@ func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgRe data.MsgData.ContentType >= constant.NotificationBegin { return nil } - // memberIDs, err := m.GroupLocalCache.GetGroupMemberIDs(ctx, data.MsgData.GroupID) - // if err != nil { - // return err - // } - // if !utils.IsContain(data.MsgData.SendID, memberIDs) { - // return errs.ErrNotInGroupYet.Wrap() - // } + memberIDs, err := m.GroupLocalCache.GetGroupMemberIDMap(ctx, data.MsgData.GroupID) + if err != nil { + return err + } + if _, ok := memberIDs[data.MsgData.SendID]; !ok { + return errs.ErrNotInGroupYet.Wrap() + } groupMemberInfo, err := m.Group.GetGroupMemberCache(ctx, data.MsgData.GroupID, data.MsgData.SendID) if err != nil { diff --git a/pkg/localcache/option.go b/pkg/localcache/option.go index 178faf273..40f56f2d0 100644 --- a/pkg/localcache/option.go +++ b/pkg/localcache/option.go @@ -107,15 +107,6 @@ func WithDeleteKeyBefore(fn func(ctx context.Context, key ...string)) Option { } } -func WithDeleteLocal(fn func(fn func(key ...string))) Option { - if fn == nil { - panic("fn should not be nil") - } - return func(o *option) { - o.delCh = fn - } -} - type emptyTarget struct{} func (e emptyTarget) IncrGetHit() {} diff --git a/pkg/rpccache/group.go b/pkg/rpccache/group.go index d3617bfc4..333966fbb 100644 --- a/pkg/rpccache/group.go +++ b/pkg/rpccache/group.go @@ -24,8 +24,43 @@ type GroupLocalCache struct { local localcache.Cache[any] } -func (g *GroupLocalCache) GetGroupMemberIDs(ctx context.Context, groupID string) ([]string, error) { - return localcache.AnyValue[[]string](g.local.Get(ctx, cachekey.GetGroupMemberIDsKey(groupID), func(ctx context.Context) (any, error) { - return g.client.GetGroupMemberIDs(ctx, groupID) +type listMap[V comparable] struct { + List []V + Map map[V]struct{} +} + +func newListMap[V comparable](values []V, err error) (*listMap[V], error) { + if err != nil { + return nil, err + } + lm := &listMap[V]{ + List: values, + Map: make(map[V]struct{}, len(values)), + } + for _, value := range values { + lm.Map[value] = struct{}{} + } + return lm, nil +} + +func (g *GroupLocalCache) getGroupMemberIDs(ctx context.Context, groupID string) (*listMap[string], error) { + return localcache.AnyValue[*listMap[string]](g.local.Get(ctx, cachekey.GetGroupMemberIDsKey(groupID), func(ctx context.Context) (any, error) { + return newListMap(g.client.GetGroupMemberIDs(ctx, groupID)) })) } + +func (g *GroupLocalCache) GetGroupMemberIDs(ctx context.Context, groupID string) ([]string, error) { + res, err := g.getGroupMemberIDs(ctx, groupID) + if err != nil { + return nil, err + } + return res.List, nil +} + +func (g *GroupLocalCache) GetGroupMemberIDMap(ctx context.Context, groupID string) (map[string]struct{}, error) { + res, err := g.getGroupMemberIDs(ctx, groupID) + if err != nil { + return nil, err + } + return res.Map, nil +}