- Removed Gorse-related configurations, handlers, and dependencies from the codebase. - Introduced HotRank feature with configuration options for ranking posts based on recent activity. - Updated application structure to support HotRank processing, including new caching mechanisms and database interactions. - Cleaned up related DTOs and repository methods to reflect the removal of Gorse and the addition of HotRank functionality.
203 lines
6.5 KiB
Go
203 lines
6.5 KiB
Go
package cache
|
||
|
||
import (
|
||
"fmt"
|
||
)
|
||
|
||
// 缓存键前缀常量
|
||
const (
|
||
// 帖子相关
|
||
PrefixPostList = "posts:list"
|
||
PrefixPost = "posts:detail"
|
||
// HotRankZSet 热门榜(有序集合,member=post_id,score=归一化热度,仅存 TopN)
|
||
HotRankZSet = "posts:hot:zset"
|
||
// HotRankTopIDs 热门榜有序 post_id 列表(JSON []string,供分层缓存本地层命中)
|
||
HotRankTopIDs = "posts:hot:top_ids"
|
||
|
||
// 会话相关
|
||
PrefixConversationList = "conversations:list"
|
||
PrefixConversationDetail = "conversations:detail"
|
||
|
||
// 群组相关
|
||
PrefixGroupMembers = "groups:members"
|
||
PrefixGroupInfo = "groups:info"
|
||
|
||
// 未读数相关
|
||
PrefixUnreadSystem = "unread:system"
|
||
PrefixUnreadConversation = "unread:conversation"
|
||
PrefixUnreadDetail = "unread:detail"
|
||
|
||
// 用户相关
|
||
PrefixUserInfo = "users:info"
|
||
PrefixUserMe = "users:me"
|
||
|
||
// 消息缓存相关
|
||
keyPrefixMsgHash = "msg_hash" // 消息详情 Hash
|
||
keyPrefixMsgIndex = "msg_index" // 消息索引 Sorted Set
|
||
keyPrefixMsgCount = "msg_count" // 消息计数
|
||
keyPrefixMsgSeq = "msg_seq" // Seq 计数器
|
||
keyPrefixMsgPage = "msg_page" // 分页缓存
|
||
)
|
||
|
||
// PostListKey 生成帖子列表缓存键
|
||
// postType: 帖子类型 (hot, follow, latest)
|
||
// page: 页码
|
||
// pageSize: 每页数量
|
||
// userID: 用户维度(仅在个性化列表如 follow 场景使用)
|
||
// HotRankZSetKey 热门榜 Redis ZSET 逻辑键(仅存 TopN,会经 normalizeKey 加前缀)
|
||
func HotRankZSetKey() string {
|
||
return HotRankZSet
|
||
}
|
||
|
||
// HotRankTopIDsKey 热门榜 Top 顺序 ID 列表键(会经 normalizeKey 加前缀)
|
||
func HotRankTopIDsKey() string {
|
||
return HotRankTopIDs
|
||
}
|
||
|
||
func PostListKey(postType string, userID string, page, pageSize int) string {
|
||
if userID == "" {
|
||
return fmt.Sprintf("%s:%s:%d:%d", PrefixPostList, postType, page, pageSize)
|
||
}
|
||
return fmt.Sprintf("%s:%s:%s:%d:%d", PrefixPostList, postType, userID, page, pageSize)
|
||
}
|
||
|
||
// PostDetailKey 生成帖子详情缓存键
|
||
func PostDetailKey(postID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixPost, postID)
|
||
}
|
||
|
||
// ConversationListKey 生成会话列表缓存键
|
||
func ConversationListKey(userID string, page, pageSize int) string {
|
||
return fmt.Sprintf("%s:%s:%d:%d", PrefixConversationList, userID, page, pageSize)
|
||
}
|
||
|
||
// ConversationDetailKey 生成会话详情缓存键
|
||
func ConversationDetailKey(conversationID, userID string) string {
|
||
return fmt.Sprintf("%s:%s:%s", PrefixConversationDetail, conversationID, userID)
|
||
}
|
||
|
||
// GroupMembersKey 生成群组成员缓存键
|
||
func GroupMembersKey(groupID string, page, pageSize int) string {
|
||
return fmt.Sprintf("%s:%s:page:%d:size:%d", PrefixGroupMembers, groupID, page, pageSize)
|
||
}
|
||
|
||
// GroupMembersAllKey 生成群组全量成员ID列表缓存键
|
||
func GroupMembersAllKey(groupID string) string {
|
||
return fmt.Sprintf("%s:all:%s", PrefixGroupMembers, groupID)
|
||
}
|
||
|
||
// GroupInfoKey 生成群组信息缓存键
|
||
func GroupInfoKey(groupID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixGroupInfo, groupID)
|
||
}
|
||
|
||
// UnreadSystemKey 生成系统消息未读数缓存键
|
||
func UnreadSystemKey(userID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixUnreadSystem, userID)
|
||
}
|
||
|
||
// UnreadConversationKey 生成会话未读总数缓存键
|
||
func UnreadConversationKey(userID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixUnreadConversation, userID)
|
||
}
|
||
|
||
// UnreadDetailKey 生成单个会话未读数缓存键
|
||
func UnreadDetailKey(userID, conversationID string) string {
|
||
return fmt.Sprintf("%s:%s:%s", PrefixUnreadDetail, userID, conversationID)
|
||
}
|
||
|
||
// UserInfoKey 生成用户信息缓存键
|
||
func UserInfoKey(userID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixUserInfo, userID)
|
||
}
|
||
|
||
// UserMeKey 生成当前用户信息缓存键
|
||
func UserMeKey(userID string) string {
|
||
return fmt.Sprintf("%s:%s", PrefixUserMe, userID)
|
||
}
|
||
|
||
// InvalidatePostList 失效帖子列表缓存
|
||
func InvalidatePostList(cache Cache) {
|
||
cache.DeleteByPrefix(PrefixPostList)
|
||
}
|
||
|
||
// InvalidatePostDetail 失效帖子详情缓存
|
||
func InvalidatePostDetail(cache Cache, postID string) {
|
||
cache.Delete(PostDetailKey(postID))
|
||
}
|
||
|
||
// InvalidateConversationList 失效会话列表缓存
|
||
func InvalidateConversationList(cache Cache, userID string) {
|
||
cache.DeleteByPrefix(PrefixConversationList + ":" + userID + ":")
|
||
}
|
||
|
||
// InvalidateConversationDetail 失效会话详情缓存
|
||
func InvalidateConversationDetail(cache Cache, conversationID, userID string) {
|
||
cache.Delete(ConversationDetailKey(conversationID, userID))
|
||
}
|
||
|
||
// InvalidateGroupMembers 失效群组成员缓存
|
||
func InvalidateGroupMembers(cache Cache, groupID string) {
|
||
cache.DeleteByPrefix(PrefixGroupMembers + ":" + groupID)
|
||
}
|
||
|
||
// InvalidateGroupInfo 失效群组信息缓存
|
||
func InvalidateGroupInfo(cache Cache, groupID string) {
|
||
cache.Delete(GroupInfoKey(groupID))
|
||
}
|
||
|
||
// InvalidateUnreadSystem 失效系统消息未读数缓存
|
||
func InvalidateUnreadSystem(cache Cache, userID string) {
|
||
cache.Delete(UnreadSystemKey(userID))
|
||
}
|
||
|
||
// InvalidateUnreadConversation 失效会话未读数缓存
|
||
func InvalidateUnreadConversation(cache Cache, userID string) {
|
||
cache.Delete(UnreadConversationKey(userID))
|
||
}
|
||
|
||
// InvalidateUnreadDetail 失效单个会话未读数缓存
|
||
func InvalidateUnreadDetail(cache Cache, userID, conversationID string) {
|
||
cache.Delete(UnreadDetailKey(userID, conversationID))
|
||
}
|
||
|
||
// InvalidateUserInfo 失效用户信息缓存
|
||
func InvalidateUserInfo(cache Cache, userID string) {
|
||
cache.Delete(UserInfoKey(userID))
|
||
cache.Delete(UserMeKey(userID))
|
||
}
|
||
|
||
// ============================================================
|
||
// 消息缓存 Key 生成函数
|
||
// ============================================================
|
||
|
||
// MessageHashKey 消息详情 Hash key
|
||
func MessageHashKey(convID string) string {
|
||
return fmt.Sprintf("%s:%s", keyPrefixMsgHash, convID)
|
||
}
|
||
|
||
// MessageIndexKey 消息索引 Sorted Set key
|
||
func MessageIndexKey(convID string) string {
|
||
return fmt.Sprintf("%s:%s", keyPrefixMsgIndex, convID)
|
||
}
|
||
|
||
// MessageCountKey 消息计数 key
|
||
func MessageCountKey(convID string) string {
|
||
return fmt.Sprintf("%s:%s", keyPrefixMsgCount, convID)
|
||
}
|
||
|
||
// MessageSeqKey Seq 计数器 key
|
||
func MessageSeqKey(convID string) string {
|
||
return fmt.Sprintf("%s:%s", keyPrefixMsgSeq, convID)
|
||
}
|
||
|
||
// MessagePageKey 分页缓存 key
|
||
func MessagePageKey(convID string, page, pageSize int) string {
|
||
return fmt.Sprintf("%s:%s:%d:%d", keyPrefixMsgPage, convID, page, pageSize)
|
||
}
|
||
|
||
// InvalidateMessagePages 失效会话消息分页缓存
|
||
func InvalidateMessagePages(cache Cache, conversationID string) {
|
||
cache.DeleteByPrefix(fmt.Sprintf("%s:%s:", keyPrefixMsgPage, conversationID))
|
||
}
|