系统架构层面流量控制功能完善

This commit is contained in:
flswld
2023-02-05 07:18:43 +08:00
parent cfb001c18a
commit 94c8db402a
51 changed files with 1049 additions and 2408 deletions

View File

@@ -1,13 +1,16 @@
package dao
import (
"bytes"
"context"
"io"
"strconv"
"time"
"hk4e/gs/model"
"hk4e/pkg/logger"
"github.com/pierrec/lz4/v4"
"github.com/vmihailenco/msgpack/v5"
)
@@ -18,13 +21,28 @@ func (d *Dao) GetRedisPlayerKey(userId uint32) string {
}
func (d *Dao) GetRedisPlayer(userId uint32) *model.Player {
playerData, err := d.redis.Get(context.TODO(), d.GetRedisPlayerKey(userId)).Result()
playerDataLz4, err := d.redis.Get(context.TODO(), d.GetRedisPlayerKey(userId)).Result()
if err != nil {
logger.Error("get player from redis error: %v", err)
return nil
}
// 解压
startTime := time.Now().UnixNano()
in := bytes.NewReader([]byte(playerDataLz4))
out := new(bytes.Buffer)
lz4Reader := lz4.NewReader(in)
_, err = io.Copy(out, lz4Reader)
if err != nil {
logger.Error("lz4 decode player data error: %v", err)
return nil
}
playerData := out.Bytes()
endTime := time.Now().UnixNano()
costTime := endTime - startTime
logger.Debug("lz4 decode cost time: %v ns, before len: %v, after len: %v, ratio lz4/raw: %v",
costTime, len(playerDataLz4), len(playerData), float64(len(playerDataLz4))/float64(len(playerData)))
player := new(model.Player)
err = msgpack.Unmarshal([]byte(playerData), player)
err = msgpack.Unmarshal(playerData, player)
if err != nil {
logger.Error("unmarshal player error: %v", err)
return nil
@@ -38,9 +56,29 @@ func (d *Dao) SetRedisPlayer(player *model.Player) {
logger.Error("marshal player error: %v", err)
return
}
err = d.redis.Set(context.TODO(), d.GetRedisPlayerKey(player.PlayerID), playerData, time.Hour*24*30).Err()
// 压缩
startTime := time.Now().UnixNano()
in := bytes.NewReader(playerData)
out := new(bytes.Buffer)
lz4Writer := lz4.NewWriter(out)
_, err = io.Copy(lz4Writer, in)
if err != nil {
logger.Error("set player from redis error: %v", err)
logger.Error("lz4 encode player data error: %v", err)
return
}
err = lz4Writer.Close()
if err != nil {
logger.Error("lz4 encode player data error: %v", err)
return
}
playerDataLz4 := out.Bytes()
endTime := time.Now().UnixNano()
costTime := endTime - startTime
logger.Debug("lz4 encode cost time: %v ns, before len: %v, after len: %v, ratio lz4/raw: %v",
costTime, len(playerData), len(playerDataLz4), float64(len(playerDataLz4))/float64(len(playerData)))
err = d.redis.Set(context.TODO(), d.GetRedisPlayerKey(player.PlayerID), playerDataLz4, time.Hour*24*30).Err()
if err != nil {
logger.Error("set player to redis error: %v", err)
return
}
}