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") diff --git a/src/server/game/var.go b/src/server/game/var.go index b041260e..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,43 @@ 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{}) { + 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 ( diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index fbf887e4..ff8be84d 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -110,9 +110,42 @@ func (f *VarMgr) version() { // future version update f.fixbug() // 修复用户变量冗余数据 f.getData().Version = 2 + case 2: + f.translateToRedis() // 将用户变量迁移到Redis + f.getData().Version = 3 } } +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) + } + 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) +} + func (f *VarMgr) ZeroUpdate() { data := f.getData() data.mu.Lock() @@ -124,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() }) @@ -160,25 +186,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{} @@ -188,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 { @@ -227,18 +248,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 +275,10 @@ 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.Debug("SetUserVarDataHandler err : %s, key: %s", err, v.Key) } ved := varData[v.Key] if ved == nil { @@ -264,7 +290,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 } diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index 36fc774e..4c1e614a 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -841,7 +841,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 (