diff --git a/src/server/db/Redis.go b/src/server/db/Redis.go index f8f59896..bc5ab33d 100644 --- a/src/server/db/Redis.go +++ b/src/server/db/Redis.go @@ -164,6 +164,17 @@ func RedisGetKey(key string) (string, error) { return val, nil } +func RedisGetKeyBytes(key string) ([]byte, error) { + if RdbRead == nil { + return nil, nil + } + val, err := RdbRead.Get(ctx, key).Bytes() + if err != nil { + return nil, err + } + return val, nil +} + func RedisDelKey(key string) { if RdbWrite == nil { log.Debug("redis write client is nil") diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 03c9cb89..28cc71c8 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -986,7 +986,7 @@ func (p *Player) UpdateUserInfo() { //TODO 存储到redis 在新版本中将优化成gob进行压缩 value, _ := json.Marshal(simple) - IdStr := strconv.Itoa(int(p.M_DwUin)) + IdStr := GoUtil.String(p.M_DwUin) go db.RedisSetKeyBytes(IdStr, value, 0) } diff --git a/src/server/game/var.go b/src/server/game/var.go index a9702673..61046939 100644 --- a/src/server/game/var.go +++ b/src/server/game/var.go @@ -1,6 +1,8 @@ package game import ( + "fmt" + "server/db" "server/game/mod/msg" GoUtil "server/game_util" "server/pkg/github.com/name5566/leaf/log" @@ -17,15 +19,27 @@ const ( ) func (p *Player) GetVarData(key string) interface{} { - data, err := GetUserData(p.M_DwUin, key) + cache := &VarExpireData{} + err := LoadCacheVarData(key, cache) if err != nil { log.Error("GetVarData err : %s", err) return nil } - if data == nil { + return cache.D +} + +func (p *Player) GetUserVarData(key string) interface{} { + cache := map[string]*VarExpireData{} + err := LoadCacheVarData(GoUtil.GetVarKey(int(p.M_DwUin)), cache) + if err != nil { + log.Error("GetVarData err : %s", err) return nil } - return data.Extra + data, ok := cache[key] + if !ok { + return nil + } + return data.D } func GetServerVarData(key string) interface{} { @@ -100,7 +114,7 @@ func (p *Player) SubPlayroomChip(PlayerId int) { } func (p *Player) GetPlayroomUpvote() int { - data := p.GetVarData(VAR_PLAYROOM_UPVOTE) + data := p.GetUserVarData(VAR_PLAYROOM_UPVOTE) if data == nil { return 0 } @@ -108,7 +122,7 @@ func (p *Player) GetPlayroomUpvote() int { } func (p *Player) GetPlayroomChip() int { - data := p.GetVarData(VAR_PLAYROOM_CHIP) + data := p.GetUserVarData(VAR_PLAYROOM_CHIP) if data == nil { return 0 } @@ -120,7 +134,7 @@ func (p *Player) SetPlayroomKiss(Kiss int) { } func (p *Player) GetPlayroomKiss() int { - data := p.GetVarData(VAR_PLAYROOM_KISS) + data := p.GetUserVarData(VAR_PLAYROOM_KISS) if data == nil { return 0 } @@ -146,3 +160,23 @@ func (p *Player) GetCatnipPartner(Uid int) []int { } return GoUtil.IntSlice(data.Extra) } + +func SaveCacheVarData(key string, value interface{}) { + data, err := GoUtil.GobMarshal(value) + if err != nil { + log.Error("SaveCacheVarData GobMarshal err : %s", err) + return + } + db.RedisSetKeyBytes(key, data, 0) +} + +func LoadCacheVarData(key string, value interface{}) error { + data, err := db.RedisGetKeyBytes(key) + if err != nil { + return err + } + if data == nil { + return fmt.Errorf("no data") + } + return GoUtil.GobUnmarshal(data, value) +} diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index 1df2c8ca..0bc9f9f1 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -140,6 +140,7 @@ func (f *VarMgr) SetUserVar(uid int, key string, value interface{}) { } ved.D = value varData[key] = ved + SaveCacheVarData(GoUtil.GetVarKey(uid), varData) } func (f *VarMgr) GetUserVar(uid int, key string) *VarExpireData { @@ -160,6 +161,7 @@ func (f *VarMgr) SetVar(key string, value interface{}) { f.getData().NewVar[key] = &VarExpireData{ D: value, } + SaveCacheVarData(key, f.getData().NewVar[key]) } func (f *VarMgr) GetVar(key string) *VarExpireData { @@ -217,6 +219,7 @@ func SetVarDataHandler(m *msg.Msg) (interface{}, error) { ved.T = m.End } data.Var[v.Key] = ved + SaveCacheVarData(v.Key, ved) } return nil, nil } @@ -277,6 +280,8 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { } data.Var[v.Key] = ved } + // 保存到缓存中 + SaveCacheVarData(GoUtil.GetVarKey(m.From), data.NewUseVar[m.From]) return nil, nil } diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index a57553fa..fde503f6 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -531,3 +531,7 @@ func GetISOCodeByIP(ip string) (string, error) { } return GetISOCodeByCountry(country) } + +func GetVarKey(Uid int) string { + return fmt.Sprintf("var_%d", Uid) +}