From f2689fe4f11bf88917f580a9952fc968b1f0faa4 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:54:43 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=8F=98=E9=87=8F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/var.go | 20 +++++++++++ src/server/game/var_mgr.go | 68 +++++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/src/server/game/var.go b/src/server/game/var.go index b041260e..589ff354 100644 --- a/src/server/game/var.go +++ b/src/server/game/var.go @@ -213,6 +213,26 @@ func LoadCacheVarData(key string, value interface{}) error { return GoUtil.GobUnmarshal(data, value) } +func SaveUserVarData(key string, value interface{}) { + buf, err := json.Marshal(value) + if err != nil { + log.Error("failed to marshal user var data for key %s: %v", key, err) + return + } + db.RedisSetKey(key, string(buf), 0) +} + +func LoadUserVarData(key string, value interface{}) error { + data, err := db.RedisGetKey(key) + if err != nil { + return err + } + if data == "" { + return fmt.Errorf("no data") + } + return json.Unmarshal([]byte(data), value) +} + const ( notifyKeyFriendApply = "friend_apply_n" notifyKeyPetroomGame = "petroom_game_n" diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index fbf887e4..440be354 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -113,6 +113,21 @@ func (f *VarMgr) version() { } } +func (f *VarMgr) translateToRedis() { + data := f.getData() + data.mu.Lock() + defer data.mu.Unlock() + for k, v := range data.NewUseVar { + if v == nil { + continue + } + key := GoUtil.GetVarKey(k) + SaveUserVarData(key, v) + log.Debug("translateToRedis: uid %d, varData %v", k, v) + } + data.NewUseVar = make(map[int]map[string]*VarExpireData) +} + func (f *VarMgr) ZeroUpdate() { data := f.getData() data.mu.Lock() @@ -160,25 +175,20 @@ func (f *VarMgr) HandleCatnipPartner(Uid, Partner, GameId int, EndTime int64) (i } func (f *VarMgr) SetUserVar(uid int, key string, value interface{}) { - varData := f.getData().NewUseVar[uid] - if varData == nil { - varData = make(map[string]*VarExpireData) - f.getData().NewUseVar[uid] = varData - } + varData := make(map[string]*VarExpireData) + LoadUserVarData(GoUtil.GetVarKey(uid), &varData) ved, ok := varData[key] if !ok { ved = &VarExpireData{} } ved.D = value varData[key] = ved - SaveCacheVarData(GoUtil.GetVarKey(uid), varData) + SaveUserVarData(GoUtil.GetVarKey(uid), varData) } func (f *VarMgr) GetUserVar(uid int, key string) *VarExpireData { - varData := f.getData().NewUseVar[uid] - if varData == nil { - varData = make(map[string]*VarExpireData) - } + varData := make(map[string]*VarExpireData) + LoadUserVarData(GoUtil.GetVarKey(uid), &varData) ved, ok := varData[key] if !ok { ved = &VarExpireData{} @@ -227,18 +237,23 @@ 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 { - userVar, _ = varData[v.Key] - } - if userVar == nil { - userVar = &VarExpireData{} - } - ReplyPlayerMsgASync(m, userVar.D) - return userVar, nil + v, ok := m.Extra.(msg.VarData) + if !ok { + log.Error("GetUserVarDataHandler err : invalid parameters, key: %s", v.Key) + return nil, fmt.Errorf("invalid parameters for getting var data") } - return nil, fmt.Errorf("invalid parameters for getting var data") + varData := make(map[string]*VarExpireData) + err := LoadUserVarData(GoUtil.GetVarKey(m.From), &varData) + if err != nil { + log.Error("GetUserVarDataHandler err : %s, key: %s", err, v.Key) + return nil, fmt.Errorf("failed to load user var data: %v", err) + } + userVar, _ := varData[v.Key] + if userVar == nil { + userVar = &VarExpireData{} + } + ReplyPlayerMsgASync(m, userVar.D) + return userVar, nil } func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { @@ -249,10 +264,11 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { if !ok { return nil, fmt.Errorf("invalid parameters for setting var data") } - varData := data.NewUseVar[m.To] - if varData == nil { - varData = make(map[string]*VarExpireData) - data.NewUseVar[m.To] = varData + varData := make(map[string]*VarExpireData) + err := LoadUserVarData(GoUtil.GetVarKey(m.To), &varData) + if err != nil { + log.Error("SetUserVarDataHandler err : %s, key: %s", err, v.Key) + return nil, fmt.Errorf("failed to load user var data: %v", err) } ved := varData[v.Key] if ved == nil { @@ -264,7 +280,7 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { } varData[v.Key] = ved log.Debug("SetUserVarDataHandler: uid %d, key %s, value %v, setType %d, end %d", m.To, v.Key, v.Value, v.SetType, m.End) - SaveCacheVarData(GoUtil.GetVarKey(m.To), varData) + SaveUserVarData(GoUtil.GetVarKey(m.To), varData) return nil, nil } From a59fd1357bb986045ed28c393e483766dc89558b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:22:50 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AD=98=E5=82=A8=E9=83=BD=E4=BD=BF?= =?UTF-8?q?=E7=94=A8json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/var.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/server/game/var.go b/src/server/game/var.go index 589ff354..d89224c6 100644 --- a/src/server/game/var.go +++ b/src/server/game/var.go @@ -42,7 +42,7 @@ func GetDailyVarData(key string) interface{} { func GetUserVarData(key string, PlayerId int) interface{} { cache := map[string]*VarExpireData{} - err := LoadCacheVarData(GoUtil.GetVarKey(int(PlayerId)), &cache) + err := LoadUserVarData(GoUtil.GetVarKey(int(PlayerId)), &cache) if err != nil { // log.Error("GetUserVarData err : %s, key: %s", err, key) return nil @@ -194,23 +194,23 @@ func (p *Player) GetCatnipPartner(Uid int) []int { } func SaveCacheVarData(key string, value interface{}) { - data, err := GoUtil.GobMarshal(value) + buf, err := json.Marshal(value) if err != nil { - log.Error("SaveCacheVarData GobMarshal err : %s", err) + log.Error("failed to marshal user var data for key %s: %v", key, err) return } - db.RedisSetKeyBytes(key, data, 0) + db.RedisSetKey(key, string(buf), 0) } func LoadCacheVarData(key string, value interface{}) error { - data, err := db.RedisGetKeyBytes(key) + data, err := db.RedisGetKey(key) if err != nil { return err } - if data == nil { + if data == "" { return fmt.Errorf("no data") } - return GoUtil.GobUnmarshal(data, value) + return json.Unmarshal([]byte(data), value) } func SaveUserVarData(key string, value interface{}) { From e87cdec2408d1bc5a8ad5fbd43266feaf038ca91 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:31:25 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/var_mgr.go | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index 440be354..ff8be84d 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -110,6 +110,9 @@ func (f *VarMgr) version() { // future version update f.fixbug() // 修复用户变量冗余数据 f.getData().Version = 2 + case 2: + f.translateToRedis() // 将用户变量迁移到Redis + f.getData().Version = 3 } } @@ -125,6 +128,21 @@ func (f *VarMgr) translateToRedis() { SaveUserVarData(key, v) log.Debug("translateToRedis: uid %d, varData %v", k, v) } + for k, v := range data.NewVar { + if v == nil { + continue + } + SaveCacheVarData(k, v) + log.Debug("translateToRedis: varKey %s, varData %v", k, v) + } + for k, v := range data.DailyVar { + if v == nil { + continue + } + SaveCacheVarData(k, v) + log.Debug("translateToRedis: dailyVarKey %s, varData %v", k, v) + } + data.NewVar = make(map[string]*VarExpireData) data.NewUseVar = make(map[int]map[string]*VarExpireData) } @@ -139,13 +157,6 @@ func (f *VarMgr) ZeroUpdate() { Four: Card1, Five: Card2, }) - for k, v := range data.NewVar { - if v.T < GoUtil.ZeroTimestamp() { - delete(data.NewVar, k) - } - } - // 清空每日变量 - data.DailyVar = make(map[string]*VarExpireData) f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { f.ZeroUpdate() }) @@ -198,10 +209,10 @@ func (f *VarMgr) GetUserVar(uid int, key string) *VarExpireData { } func (f *VarMgr) SetVar(key string, value interface{}) { - f.getData().NewVar[key] = &VarExpireData{ - D: value, - } - SaveCacheVarData(key, f.getData().NewVar[key]) + data := &VarExpireData{} + LoadCacheVarData(key, data) + data.D = value + SaveCacheVarData(key, data) } func (f *VarMgr) getData() *VarData { @@ -267,8 +278,7 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { varData := make(map[string]*VarExpireData) err := LoadUserVarData(GoUtil.GetVarKey(m.To), &varData) if err != nil { - log.Error("SetUserVarDataHandler err : %s, key: %s", err, v.Key) - return nil, fmt.Errorf("failed to load user var data: %v", err) + log.Debug("SetUserVarDataHandler err : %s, key: %s", err, v.Key) } ved := varData[v.Key] if ved == nil { From 703c46d53b1bfd24402d2f433cefb6ad642df72a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:32:15 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/guide_task/guide_task_cfg.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/conf/guide_task/guide_task_cfg.go b/src/server/conf/guide_task/guide_task_cfg.go index 09212079..4b73e92b 100644 --- a/src/server/conf/guide_task/guide_task_cfg.go +++ b/src/server/conf/guide_task/guide_task_cfg.go @@ -33,7 +33,6 @@ func GetTaskRewardById(Id int) []*item.Item { func GetTaskById(Id int) string { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id) if err != nil { - log.Debug("GetTaskById err:%v, Id=%d", err, Id) return "" } return gamedata.GetStringValue(data, "Task") From 2fb4a6e2bee66655e9b9ddfb785fbc229e0fd71b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:38:55 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B0=E7=9A=84var=20k?= =?UTF-8?q?ey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game_util/GoUtil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index e4ffba6e..3e287013 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -839,7 +839,7 @@ func GetISOCodeByIP(ip string) (string, error) { } func GetVarKey(Uid int) string { - return fmt.Sprintf("var_%d", Uid) + return fmt.Sprintf("new_var_%d", Uid) } const (