【架构优化】1.var删除冗余数据;2.champship增加redis缓存,增加读写锁;3.message过滤过期消息,删除空信箱
This commit is contained in:
parent
a80d65ccd2
commit
9b08cdebe6
@ -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) {
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user