【架构优化】1.var删除冗余数据;2.champship增加redis缓存,增加读写锁;3.message过滤过期消息,删除空信箱

This commit is contained in:
hahwu 2026-02-04 18:10:45 +08:00
parent a80d65ccd2
commit 9b08cdebe6
3 changed files with 51 additions and 19 deletions

View File

@ -850,8 +850,8 @@ func (c *ChampshipMgr) SetRankCache(Uid int) {
PreGroupId := c.getData().PreGroupInfo[Uid] PreGroupId := c.getData().PreGroupInfo[Uid]
GroupId := c.getData().GroupInfo[Uid] GroupId := c.getData().GroupInfo[Uid]
key := fmt.Sprintf("champship_rank_cache_%d", Uid) key := fmt.Sprintf("champship_rank_cache_%d", Uid)
log.Debug("GetRankCache key:%s; data:%s", key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId)) log.Debug("SetRankCache key:%s; data:%s", key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId))
db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), 86400*2) db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), time.Second*172800)
} }
func GetRankCache(Uid int) (int, int, int, int) { func GetRankCache(Uid int) (int, int, int, int) {

View File

@ -132,6 +132,7 @@ func FixBug() {
// 先更新 PlayerList需要加锁 // 先更新 PlayerList需要加锁
messageMgrData.mu.Lock() messageMgrData.mu.Lock()
defer messageMgrData.mu.Unlock() defer messageMgrData.mu.Unlock()
now := GoUtil.Now()
for k, v := range messageMgrData.MessageList { for k, v := range messageMgrData.MessageList {
if k < 100000 { if k < 100000 {
delete(messageMgrData.MessageList, k) delete(messageMgrData.MessageList, k)
@ -139,11 +140,14 @@ func FixBug() {
} }
// 反向遍历以安全删除元素 // 反向遍历以安全删除元素
for i := len(v.Messages) - 1; i >= 0; i-- { for i := len(v.Messages) - 1; i >= 0; i-- {
if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) {
// 删除消息 // 删除消息
v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) v.Messages = append(v.Messages[:i], v.Messages[i+1:]...)
} }
} }
if len(v.Messages) == 0 {
delete(messageMgrData.MessageList, k)
}
} }
} }
@ -175,7 +179,7 @@ func (m *MessageMgr) CenterRegister() {
m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_INFO, MessageHandlerFunc(ChampshipRankInfoHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_INFO, MessageHandlerFunc(ChampshipRankInfoHandler))
m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_LIST, MessageHandlerFunc(ChampshipRankListHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_LIST, MessageHandlerFunc(ChampshipRankListHandler))
m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_PRE_RANK, MessageHandlerFunc(ChampshipRankPreHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_PRE_RANK, MessageHandlerFunc(ChampshipRankPreHandler))
m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_GROUP, MessageHandlerFunc(ChampshipInRankHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_GROUP, MessageHandlerFunc(ChampshipGroupHandler))
} }
} }
@ -295,6 +299,15 @@ func PlayerLoginHandler(data *msg.Msg) (interface{}, error) {
messages := getMessge(int64(data.From)) messages := getMessge(int64(data.From))
messages.mu.Lock() messages.mu.Lock()
// 复制消息列表,避免在锁内发送消息 // 复制消息列表,避免在锁内发送消息
// 过滤过期消息
now := GoUtil.Now()
validMessages := make([]*msg.Msg, 0, len(messages.Messages))
for _, message := range messages.Messages {
if message.End == 0 || message.End >= now {
validMessages = append(validMessages, message)
}
}
messages.Messages = validMessages
messagesToSend := make([]*msg.Msg, len(messages.Messages)) messagesToSend := make([]*msg.Msg, len(messages.Messages))
copy(messagesToSend, messages.Messages) copy(messagesToSend, messages.Messages)
messages.mu.Unlock() messages.mu.Unlock()
@ -935,5 +948,12 @@ func deleteMessage(m *msg.Msg) error {
messages.Messages[len(messages.Messages)-1] = nil // 清除最后一个元素的引用 messages.Messages[len(messages.Messages)-1] = nil // 清除最后一个元素的引用
messages.Messages = messages.Messages[:len(messages.Messages)-1] messages.Messages = messages.Messages[:len(messages.Messages)-1]
} }
if len(messages.Messages) == 0 {
// 如果消息列表为空,则删除该玩家的消息列表
messageMgrData := getMessageData()
messageMgrData.mu.Lock()
defer messageMgrData.mu.Unlock()
delete(messageMgrData.MessageList, int64(m.To))
}
return nil return nil
} }

View File

@ -59,12 +59,31 @@ func (f *VarMgr) Init() {
if f.getData().ZeroTime == GoUtil.ZeroTimestamp() { if f.getData().ZeroTime == GoUtil.ZeroTimestamp() {
f.ZeroUpdate() f.ZeroUpdate()
} }
f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
f.ZeroUpdate() f.ZeroUpdate()
}) })
} }
func (f *VarMgr) fixbug() {
data := f.getData()
data.mu.Lock()
defer data.mu.Unlock()
for k, v := range data.NewUseVar {
if v != nil {
del := true
for _, ved := range v {
if ved.D.(int) != 0 {
del = false
}
}
if del {
delete(data.NewUseVar, k)
}
}
}
}
func (f *VarMgr) version() { func (f *VarMgr) version() {
switch v := f.getData().Version; v { switch v := f.getData().Version; v {
case 0: case 0:
@ -84,6 +103,10 @@ func (f *VarMgr) version() {
} }
} }
f.getData().Version = 1 f.getData().Version = 1
case 1:
// future version update
f.fixbug() // 修复用户变量冗余数据
f.getData().Version = 2
} }
} }
@ -148,7 +171,7 @@ func (f *VarMgr) GetUserVar(uid int, key string) *VarExpireData {
varData := f.getData().NewUseVar[uid] varData := f.getData().NewUseVar[uid]
if varData == nil { if varData == nil {
varData = make(map[string]*VarExpireData) varData = make(map[string]*VarExpireData)
f.getData().NewUseVar[uid] = varData //f.getData().NewUseVar[uid] = varData
} }
ved, ok := varData[key] ved, ok := varData[key]
if !ok { if !ok {
@ -165,19 +188,6 @@ func (f *VarMgr) SetVar(key string, value interface{}) {
SaveCacheVarData(key, f.getData().NewVar[key]) SaveCacheVarData(key, f.getData().NewVar[key])
} }
func (f *VarMgr) GetVar(key string) *VarExpireData {
if v, ok := f.getData().NewVar[key]; ok {
return v
}
data := &VarExpireData{}
f.getData().NewVar[key] = data
return data
}
func (f *VarMgr) DelVar(key string) {
delete(f.getData().Var, key)
}
func (f *VarMgr) getData() *VarData { func (f *VarMgr) getData() *VarData {
return f.data.(*VarData) return f.data.(*VarData)
} }
@ -227,6 +237,8 @@ func SetVarDataHandler(m *msg.Msg) (interface{}, error) {
func GetUserVarDataHandler(m *msg.Msg) (interface{}, error) { func GetUserVarDataHandler(m *msg.Msg) (interface{}, error) {
data := getVarData() data := getVarData()
data.mu.Lock()
defer data.mu.Unlock()
userVar := &VarExpireData{} userVar := &VarExpireData{}
if v, ok := m.Extra.(msg.VarData); ok { if v, ok := m.Extra.(msg.VarData); ok {
if varData, ok := data.NewUseVar[m.From]; ok { if varData, ok := data.NewUseVar[m.From]; ok {