Merge branch 'var-redis' into develop

This commit is contained in:
hahwu 2026-04-20 11:42:58 +08:00
commit 3cd086b648
4 changed files with 91 additions and 46 deletions

View File

@ -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")

View File

@ -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 (

View File

@ -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
}

View File

@ -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 (