fix tenant group topic and member cache

This commit is contained in:
richjohnrambo
2026-09-23 10:35:06 +08:00
parent 6303d07580
commit b413560455
4 changed files with 125 additions and 27 deletions
+102 -10
View File
@@ -141,13 +141,13 @@ const (
cacheNamespaceTopic = "topic"
cacheNamespaceSub = "sub"
cacheNamespaceGroupSettings = "group_settings"
cacheNamespaceGroupMember = "group_member"
cacheNamespaceGroupMember = "group_member:v2"
cacheNamespaceVerification = "verification"
cacheNamespaceActionToken = "action_token"
cacheNamespaceFriends = "friends"
cacheNamespaceBlocklist = "blocklist"
cacheNamespaceUnreadCount = "unread_count"
cacheNamespaceGroupPage = "group_member_page"
cacheNamespaceGroupPage = "group_member_page:v2"
)
// TenantsPersistenceInterface defines tenant registry lookups used before authentication.
@@ -1986,7 +1986,7 @@ func (groupBusinessMapper) UpsertMember(tenantID types.TenantID, member *types.G
}
member, err = tenantAdp.TenantGroupMemberUpsert(tenantID, member)
if err == nil && member != nil {
_ = CacheObject(tenantID, cacheNamespaceGroupMember, groupMemberCacheID(member.Topic, member.UserID), member)
_ = CacheObject(tenantID, cacheNamespaceGroupMember, groupMemberCacheID(member.Topic, member.UserID), groupMemberCacheFromType(member))
}
return member, err
}
@@ -1997,11 +1997,11 @@ func (groupBusinessMapper) GetMember(tenantID types.TenantID, topic string, uid
}
topic = strings.TrimSpace(topic)
cacheID := groupMemberCacheID(topic, uid)
var cached types.GroupMember
var cached groupMemberCache
if ok, err := GetCachedObject(tenantID, cacheNamespaceGroupMember, cacheID, &cached); err != nil {
logs.Warn.Printf("cache group member[%s]: read failed: %v", cacheID, err)
} else if ok {
return &cached, nil
return cached.toType(), nil
}
tenantAdp, err := tenantBusinessAdapter(tenantID)
if err != nil {
@@ -2009,7 +2009,7 @@ func (groupBusinessMapper) GetMember(tenantID types.TenantID, topic string, uid
}
member, err := tenantAdp.TenantGroupMemberGet(tenantID, topic, uid)
if err == nil && member != nil {
if cacheErr := CacheObject(tenantID, cacheNamespaceGroupMember, cacheID, member); cacheErr != nil {
if cacheErr := CacheObject(tenantID, cacheNamespaceGroupMember, cacheID, groupMemberCacheFromType(member)); cacheErr != nil {
logs.Warn.Printf("cache group member[%s]: write failed: %v", cacheID, cacheErr)
}
}
@@ -2030,7 +2030,7 @@ func (groupBusinessMapper) ListMembers(tenantID types.TenantID, topic string, op
opts.Cursor = strings.TrimSpace(opts.Cursor)
cacheKey := groupMemberPageCacheID(topic, opts)
if cached, ok := GetCachedGroupMemberPage(tenantID, cacheKey); ok {
return cached.Items, cached.NextCursor, nil
return groupMembersFromCaches(cached.Items), cached.NextCursor, nil
}
tenantAdp, err := tenantBusinessAdapter(tenantID)
if err != nil {
@@ -2041,15 +2041,107 @@ func (groupBusinessMapper) ListMembers(tenantID types.TenantID, topic string, op
return nil, "", err
}
CacheGroupMemberPage(tenantID, cacheKey, groupMemberPageCache{
Items: members,
Items: groupMemberCachesFromTypes(members),
NextCursor: nextCursor,
})
return members, nextCursor, nil
}
type groupMemberPageCache struct {
Items []types.GroupMember `json:"items"`
NextCursor string `json:"next_cursor"`
Items []groupMemberCache `json:"items"`
NextCursor string `json:"next_cursor"`
}
type groupMemberCache struct {
ID int64 `json:"id"`
Topic string `json:"topic"`
UserID string `json:"user_id"`
Role string `json:"role"`
MemberStatus string `json:"member_status"`
Nickname string `json:"nickname,omitempty"`
ModeWant types.AccessMode `json:"mode_want"`
ModeGiven types.AccessMode `json:"mode_given"`
Public any `json:"public,omitempty"`
Trusted any `json:"trusted,omitempty"`
Pinned bool `json:"pinned"`
MuteNotifications bool `json:"mute_notifications"`
JoinSource string `json:"join_source,omitempty"`
JoinedBy string `json:"joined_by,omitempty"`
JoinedAt time.Time `json:"joined_at"`
LeftAt *time.Time `json:"left_at,omitempty"`
RemovedBy string `json:"removed_by,omitempty"`
Version int `json:"version"`
CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"`
}
func groupMemberCachesFromTypes(members []types.GroupMember) []groupMemberCache {
items := make([]groupMemberCache, 0, len(members))
for i := range members {
items = append(items, groupMemberCacheFromType(&members[i]))
}
return items
}
func groupMembersFromCaches(items []groupMemberCache) []types.GroupMember {
members := make([]types.GroupMember, 0, len(items))
for i := range items {
members = append(members, *items[i].toType())
}
return members
}
func groupMemberCacheFromType(member *types.GroupMember) groupMemberCache {
if member == nil {
return groupMemberCache{}
}
return groupMemberCache{
ID: member.ID,
Topic: member.Topic,
UserID: member.UserID.UserId(),
Role: member.Role,
MemberStatus: member.MemberStatus,
Nickname: member.Nickname,
ModeWant: member.ModeWant,
ModeGiven: member.ModeGiven,
Public: member.Public,
Trusted: member.Trusted,
Pinned: member.Pinned,
MuteNotifications: member.MuteNotifications,
JoinSource: member.JoinSource,
JoinedBy: member.JoinedBy.UserId(),
JoinedAt: member.JoinedAt,
LeftAt: member.LeftAt,
RemovedBy: member.RemovedBy.UserId(),
Version: member.Version,
CreatedAt: member.CreatedAt,
UpdatedAt: member.UpdatedAt,
}
}
func (member groupMemberCache) toType() *types.GroupMember {
return &types.GroupMember{
ID: member.ID,
Topic: member.Topic,
UserID: types.ParseUserId(member.UserID),
Role: member.Role,
MemberStatus: member.MemberStatus,
Nickname: member.Nickname,
ModeWant: member.ModeWant,
ModeGiven: member.ModeGiven,
Public: member.Public,
Trusted: member.Trusted,
Pinned: member.Pinned,
MuteNotifications: member.MuteNotifications,
JoinSource: member.JoinSource,
JoinedBy: types.ParseUserId(member.JoinedBy),
JoinedAt: member.JoinedAt,
LeftAt: member.LeftAt,
RemovedBy: types.ParseUserId(member.RemovedBy),
Version: member.Version,
CreatedAt: member.CreatedAt,
UpdatedAt: member.UpdatedAt,
}
}
func groupMemberPageCacheID(topic string, opts types.GroupMemberListOptions) string {