提高kv持久化安全性,按需删除用户缓存

This commit is contained in:
ayflying
2025-09-01 18:35:43 +08:00
parent ce8ae4d26a
commit cd3de96761
2 changed files with 27 additions and 26 deletions

View File

@@ -225,7 +225,7 @@ func (s *sGameAct) Save(ctx context.Context, actId int) (err error) {
} }
if row, _ := updateRes.RowsAffected(); row == 0 { if row, _ := updateRes.RowsAffected(); row == 0 {
g.Log().Error(ctx, "本次更新为0更新数据失败: %v", v) 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%vadd写入数据: %v,内容:%v", vTemp.ActId, vTemp.Uid, vTemp.Action) g.Log().Debugf(ctx, "当前act%vadd写入数据: %v,内容:%v", vTemp.ActId, vTemp.Uid, vTemp.Action)
} }
return return
} }
for _, v2 := range add { for _, v2 := range add {

View File

@@ -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) 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索引的键 // 从Redis列表中获取所有用户KV索引的键
//keys, err := utils.RedisScan("user:kv:*") //keys, err := utils.RedisScan("user:kv:*")
err = tools.Redis.RedisScanV2("user:kv:*", func(keys []string) (err error) { 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 return
} }
// 定义用于存储用户数据的结构体
type ListData struct {
Uid int64 `json:"uid"`
Kv interface{} `json:"kv"`
}
var list []*ListData
// 初始化列表长度与keys数组一致
list = make([]*ListData, 0)
//需要删除的key //需要删除的key
var delKey []string
// 遍历keys获取每个用户的数据并填充到list中 // 遍历keys获取每个用户的数据并填充到list中
for _, cacheKey := range keys { for _, cacheKey := range keys {
//g.Log().Infof(ctx, "保存用户kv数据%v", v) //g.Log().Infof(ctx, "保存用户kv数据%v", v)
@@ -105,29 +106,21 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) {
Uid: uid, Uid: uid,
Kv: data, Kv: data,
}) })
delKey = append(delKey, cacheKey)
} }
// 将列表数据保存到数据库 // 将列表数据保存到数据库
if len(list) > 0 { if len(list) > 100 {
_, err2 := g.Model("game_kv").Batch(30).Data(list).Save() _, err2 := g.Model("game_kv").Data(list).Save()
list = make([]*ListData, 0)
if err2 != nil { if err2 != nil {
g.Log().Error(ctx, err2) g.Log().Error(ctx, err2)
return return
} }
//删除当前key
//批量删除key for _, v := range list {
for _, v := range delKey { go s.DelCacheKey(v.Uid)
_, err2 = g.Redis().Del(ctx, v)
if err2 != nil {
g.Log().Errorf(ctx, "删除存档失败:%v,err=%v", v, err2)
} }
} list = make([]*ListData, 0)
delKey = make([]string, 0)
} }
if err != nil { if err != nil {
g.Log().Error(ctx, "当前kv数据入库失败: %v", err) g.Log().Error(ctx, "当前kv数据入库失败: %v", err)
@@ -138,3 +131,12 @@ func (s *sGameKv) SavesV1(ctx context.Context) (err error) {
return 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)
}
}