提高kv持久化安全性,按需删除用户缓存
This commit is contained in:
@@ -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:%v,add写入数据: %v,内容:%v", vTemp.ActId, vTemp.Uid, vTemp.Action)
|
g.Log().Debugf(ctx, "当前act:%v,add写入数据: %v,内容:%v", vTemp.ActId, vTemp.Uid, vTemp.Action)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v2 := range add {
|
for _, v2 := range add {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user