拆分了聊天数据,减小玩家数据结构大小

This commit is contained in:
flswld
2023-02-12 02:00:52 +08:00
parent e4be36a434
commit d35291cb5e
17 changed files with 433 additions and 216 deletions

View File

@@ -6,6 +6,7 @@ import (
"hk4e/gs/dao"
"hk4e/gs/model"
"hk4e/pkg/logger"
"hk4e/pkg/object"
"hk4e/protocol/proto"
"github.com/vmihailenco/msgpack/v5"
@@ -141,6 +142,8 @@ func (u *UserManager) OnlineUser(userId uint32, clientSeq uint32, gateAppId stri
if player != nil {
u.SaveUserToRedisSync(player)
u.ChangeUserDbState(player, model.DbNormal)
playerDb := u.LoadUserChatMsgFromDbSync(userId)
player.ChatMsgMap = playerDb.ChatMsgMap
} else {
logger.Error("can not find user from db, uid: %v", userId)
}
@@ -170,11 +173,20 @@ type PlayerOfflineInfo struct {
// OfflineUser 玩家离线
func (u *UserManager) OfflineUser(player *model.Player, changeGsInfo *ChangeGsInfo) {
startTime := time.Now().UnixNano()
playerData, err := msgpack.Marshal(player)
if err != nil {
logger.Error("marshal player data error: %v", err)
return
}
chatMsgMapData, err := object.DeepMarshal(&player.ChatMsgMap)
if err != nil {
logger.Error("marshal chat msg map error: %v", err)
return
}
endTime := time.Now().UnixNano()
costTime := endTime - startTime
logger.Info("offline copy player data and chat msg cost time: %v ns", costTime)
go func() {
playerCopy := new(model.Player)
err := msgpack.Unmarshal(playerData, playerCopy)
@@ -185,6 +197,16 @@ func (u *UserManager) OfflineUser(player *model.Player, changeGsInfo *ChangeGsIn
playerCopy.DbState = player.DbState
u.SaveUserToDbSync(playerCopy)
u.SaveUserToRedisSync(playerCopy)
chatMsgMap := make(map[uint32][]*model.ChatMsg)
err = object.DeepUnmarshal(&chatMsgMap, chatMsgMapData)
if err != nil {
logger.Error("unmarshal chat msg map error: %v", err)
return
}
playerDb := new(dao.PlayerDb)
playerDb.PlayerID = playerCopy.PlayerID
playerDb.ChatMsgMap = chatMsgMap
u.SaveUserChatMsgToDbSync(playerDb)
LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{
EventId: UserOfflineSaveToDbFinish,
Msg: &PlayerOfflineInfo{
@@ -457,6 +479,51 @@ func (u *UserManager) SaveUserListToDbSync(insertPlayerList []*model.Player, upd
logger.Info("save user finish, insert user count: %v, update user count: %v", len(insertPlayerList), len(updatePlayerList))
}
func (u *UserManager) LoadUserChatMsgFromDbSync(userId uint32) *dao.PlayerDb {
playerDb, err := u.dao.QueryPlayerDbByID(userId)
if err != nil {
logger.Error("query player db error: %v", err)
return nil
}
return playerDb
}
func (u *UserManager) SaveUserChatMsgToDbSync(playerDb *dao.PlayerDb) {
_, err := u.dao.QueryPlayerDbByID(playerDb.PlayerID)
if err != nil {
err := u.dao.InsertPlayerDb(playerDb)
if err != nil {
logger.Error("insert player db error: %v", err)
return
}
} else {
err := u.dao.UpdatePlayerDb(playerDb)
if err != nil {
logger.Error("update player db error: %v", err)
return
}
}
}
func (u *UserManager) AppendOfflineUserChatMsgToDbSync(userId uint32, chatMsgMap map[uint32][]*model.ChatMsg) {
playerDb := u.LoadUserChatMsgFromDbSync(userId)
if playerDb == nil {
return
}
for uid, msgList := range chatMsgMap {
allMsgList, exist := playerDb.ChatMsgMap[uid]
if !exist {
allMsgList = make([]*model.ChatMsg, 0)
}
allMsgList = append(allMsgList, msgList...)
if len(allMsgList) > MaxMsgListLen {
allMsgList = allMsgList[len(allMsgList)-MaxMsgListLen:]
}
playerDb.ChatMsgMap[uid] = allMsgList
}
u.SaveUserChatMsgToDbSync(playerDb)
}
func (u *UserManager) LoadUserFromRedisSync(userId uint32) *model.Player {
player := u.dao.GetRedisPlayer(userId)
return player