From cd3de967617d31f249923d106fa8af9a0641728b Mon Sep 17 00:00:00 2001 From: ayflying Date: Mon, 1 Sep 2025 18:35:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E9=AB=98kv=E6=8C=81=E4=B9=85=E5=8C=96?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=80=A7=EF=BC=8C=E6=8C=89=E9=9C=80=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=94=A8=E6=88=B7=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/logic/gameAct/gameAct.go | 3 +- internal/logic/gameKv/gameKv.go | 50 ++++++++++++++++--------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/internal/logic/gameAct/gameAct.go b/internal/logic/gameAct/gameAct.go index a7b4e18..0cdb90c 100644 --- a/internal/logic/gameAct/gameAct.go +++ b/internal/logic/gameAct/gameAct.go @@ -225,7 +225,7 @@ func (s *sGameAct) Save(ctx context.Context, actId int) (err error) { } if row, _ := updateRes.RowsAffected(); row == 0 { g.Log().Error(ctx, "本次更新为0,更新数据失败: %v", v) - return + continue } //删除缓存 @@ -255,7 +255,6 @@ func (s *sGameAct) Save(ctx context.Context, actId int) (err error) { g.Log().Debugf(ctx, "当前act:%v,add写入数据: %v,内容:%v", vTemp.ActId, vTemp.Uid, vTemp.Action) } return - } for _, v2 := range add { diff --git a/internal/logic/gameKv/gameKv.go b/internal/logic/gameKv/gameKv.go index fdb5316..7563ea5 100644 --- a/internal/logic/gameKv/gameKv.go +++ b/internal/logic/gameKv/gameKv.go @@ -53,6 +53,15 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) { pkg.Cache("redis").Set(nil, "cron:game_kv", gtime.Now().Unix(), time.Hour) } + // 定义用于存储用户数据的结构体 + type ListData struct { + Uid int64 `json:"uid"` + Kv interface{} `json:"kv"` + } + var list []*ListData + // 初始化列表,长度与keys数组一致 + list = make([]*ListData, 0) + // 从Redis列表中获取所有用户KV索引的键 //keys, err := utils.RedisScan("user:kv:*") err = tools.Redis.RedisScanV2("user:kv:*", func(keys []string) (err error) { @@ -63,16 +72,8 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) { return } - // 定义用于存储用户数据的结构体 - type ListData struct { - Uid int64 `json:"uid"` - Kv interface{} `json:"kv"` - } - var list []*ListData - // 初始化列表,长度与keys数组一致 - list = make([]*ListData, 0) //需要删除的key - var delKey []string + // 遍历keys,获取每个用户的数据并填充到list中 for _, cacheKey := range keys { //g.Log().Infof(ctx, "保存用户kv数据%v", v) @@ -105,29 +106,21 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) { Uid: uid, Kv: data, }) - - delKey = append(delKey, cacheKey) } // 将列表数据保存到数据库 - if len(list) > 0 { - _, err2 := g.Model("game_kv").Batch(30).Data(list).Save() - list = make([]*ListData, 0) + if len(list) > 100 { + _, err2 := g.Model("game_kv").Data(list).Save() + if err2 != nil { g.Log().Error(ctx, err2) return } - - //批量删除key - for _, v := range delKey { - _, err2 = g.Redis().Del(ctx, v) - if err2 != nil { - g.Log().Errorf(ctx, "删除存档失败:%v,err=%v", v, err2) - } + //删除当前key + for _, v := range list { + go s.DelCacheKey(v.Uid) } - - delKey = make([]string, 0) - + list = make([]*ListData, 0) } if err != nil { g.Log().Error(ctx, "当前kv数据入库失败: %v", err) @@ -138,3 +131,12 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) { return } + +// 删除缓存key +func (s *sGameKv) DelCacheKey(uid int64) { + cacheKey := fmt.Sprintf("user:kv:%v", uid) + _, err := g.Redis().Del(ctx, cacheKey) + if err != nil { + g.Log().Error(ctx, err) + } +}