【架构优化】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]
GroupId := c.getData().GroupInfo[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))
db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), 86400*2)
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), time.Second*172800)
}
func GetRankCache(Uid int) (int, int, int, int) {

View File

@ -132,6 +132,7 @@ func FixBug() {
// 先更新 PlayerList需要加锁
messageMgrData.mu.Lock()
defer messageMgrData.mu.Unlock()
now := GoUtil.Now()
for k, v := range messageMgrData.MessageList {
if k < 100000 {
delete(messageMgrData.MessageList, k)
@ -139,11 +140,14 @@ func FixBug() {
}
// 反向遍历以安全删除元素
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:]...)
}
}
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_LIST, MessageHandlerFunc(ChampshipRankListHandler))
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.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))
copy(messagesToSend, messages.Messages)
messages.mu.Unlock()
@ -935,5 +948,12 @@ func deleteMessage(m *msg.Msg) error {
messages.Messages[len(messages.Messages)-1] = nil // 清除最后一个元素的引用
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
}

View File

@ -59,12 +59,31 @@ func (f *VarMgr) Init() {
if f.getData().ZeroTime == GoUtil.ZeroTimestamp() {
f.ZeroUpdate()
}
f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
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() {
switch v := f.getData().Version; v {
case 0:
@ -84,6 +103,10 @@ func (f *VarMgr) version() {
}
}
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]
if varData == nil {
varData = make(map[string]*VarExpireData)
f.getData().NewUseVar[uid] = varData
//f.getData().NewUseVar[uid] = varData
}
ved, ok := varData[key]
if !ok {
@ -165,19 +188,6 @@ func (f *VarMgr) SetVar(key string, value interface{}) {
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 {
return f.data.(*VarData)
}
@ -227,6 +237,8 @@ func SetVarDataHandler(m *msg.Msg) (interface{}, error) {
func GetUserVarDataHandler(m *msg.Msg) (interface{}, error) {
data := getVarData()
data.mu.Lock()
defer data.mu.Unlock()
userVar := &VarExpireData{}
if v, ok := m.Extra.(msg.VarData); ok {
if varData, ok := data.NewUseVar[m.From]; ok {