|
@@ -32,47 +32,100 @@ func ConvertOldRedis() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//加载活动配置表,查看哪些活动类型是开服时间活动
|
|
//加载活动配置表,查看哪些活动类型是开服时间活动
|
|
|
- path := "./config/csv/"
|
|
|
|
|
-
|
|
|
|
|
- serverproto.ItemCfgLoad(path)
|
|
|
|
|
- serverproto.ActivitiesCfgLoad(path)
|
|
|
|
|
- serverproto.GlobalCfgLoad(path)
|
|
|
|
|
- serverproto.RuneShopGiftsCfgLoad(path)
|
|
|
|
|
- serverproto.GuildBossCfgLoad(path)
|
|
|
|
|
- model.ConvertOldRedisGlobalCfg()
|
|
|
|
|
- model.ConvertOldRedisRuneCfg()
|
|
|
|
|
- for _, cfgData := range serverproto.ActivitiesCfgLoader {
|
|
|
|
|
- startDataList := strings.Split(cfgData.StartTime, ";")
|
|
|
|
|
- endDataList := strings.Split(cfgData.EndTime, ";")
|
|
|
|
|
- if len(startDataList) > 0 && len(endDataList) > 0 {
|
|
|
|
|
- tmpTimeType, _ := model.Str2Num(startDataList[0])
|
|
|
|
|
- if tmpTimeType == model.ActivitiesTime_Type_Server {
|
|
|
|
|
- typeServerActsList.Add(cfgData.Id)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- typeServerActsList.Add(int32(4)) //每日累充必须重置
|
|
|
|
|
- util.InfoF("typeServerActsList=%v", typeServerActsList.List())
|
|
|
|
|
-
|
|
|
|
|
|
|
+ //path := "./config/csv/"
|
|
|
|
|
+ //
|
|
|
|
|
+ //serverproto.ItemCfgLoad(path)
|
|
|
|
|
+ //serverproto.ActivitiesCfgLoad(path)
|
|
|
|
|
+ //serverproto.GlobalCfgLoad(path)
|
|
|
|
|
+ //serverproto.RuneShopGiftsCfgLoad(path)
|
|
|
|
|
+ //serverproto.GuildBossCfgLoad(path)
|
|
|
|
|
+ //model.ConvertOldRedisGlobalCfg()
|
|
|
|
|
+ //model.ConvertOldRedisRuneCfg()
|
|
|
|
|
+ //for _, cfgData := range serverproto.ActivitiesCfgLoader {
|
|
|
|
|
+ // startDataList := strings.Split(cfgData.StartTime, ";")
|
|
|
|
|
+ // endDataList := strings.Split(cfgData.EndTime, ";")
|
|
|
|
|
+ // if len(startDataList) > 0 && len(endDataList) > 0 {
|
|
|
|
|
+ // tmpTimeType, _ := model.Str2Num(startDataList[0])
|
|
|
|
|
+ // if tmpTimeType == model.ActivitiesTime_Type_Server {
|
|
|
|
|
+ // typeServerActsList.Add(cfgData.Id)
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ //}
|
|
|
|
|
+ //typeServerActsList.Add(int32(4)) //每日累充必须重置
|
|
|
|
|
+ //util.InfoF("typeServerActsList=%v", typeServerActsList.List())
|
|
|
|
|
+ //
|
|
|
//合并redis进程监听地址
|
|
//合并redis进程监听地址
|
|
|
tmpIpStr := ""
|
|
tmpIpStr := ""
|
|
|
if *service.IPParam != "" {
|
|
if *service.IPParam != "" {
|
|
|
tmpIpStr = *service.IPParam
|
|
tmpIpStr = *service.IPParam
|
|
|
}
|
|
}
|
|
|
- tmpPortStr := ""
|
|
|
|
|
- if *service.TempParam != "" {
|
|
|
|
|
- tmpPortStr = *service.TempParam
|
|
|
|
|
|
|
+ //tmpPortStr := ""
|
|
|
|
|
+ //if *service.TempParam != "" {
|
|
|
|
|
+ // tmpPortStr = *service.TempParam
|
|
|
|
|
+ //}
|
|
|
|
|
+
|
|
|
|
|
+ // 新增: 支持同一个redis实例按db列表执行,参数格式: -dbs 0,1,2
|
|
|
|
|
+ tmpDbStr := ""
|
|
|
|
|
+ if service.DBListParam != nil {
|
|
|
|
|
+ tmpDbStr = strings.TrimSpace(*service.DBListParam)
|
|
|
}
|
|
}
|
|
|
- tmpPortStrList := strings.Split(tmpPortStr, ",")
|
|
|
|
|
- for idx := 0; idx < len(tmpPortStrList); idx++ {
|
|
|
|
|
- ipStr := tmpIpStr + ":" + tmpPortStrList[idx]
|
|
|
|
|
- if idx == len(tmpPortStrList)-1 {
|
|
|
|
|
- convertOldRedis(ipStr, true)
|
|
|
|
|
- } else {
|
|
|
|
|
- convertOldRedis(ipStr, false)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if tmpDbStr != "" {
|
|
|
|
|
+ if tmpIpStr == "" {
|
|
|
|
|
+ util.InfoF("convert abort: ip is empty when using -dbs")
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
- util.InfoF("convert finish ipStr=%v", ipStr)
|
|
|
|
|
|
|
+ dbStrList := strings.Split(tmpDbStr, ",")
|
|
|
|
|
+ dbList := make([]int, 0, len(dbStrList))
|
|
|
|
|
+ for _, dbRaw := range dbStrList {
|
|
|
|
|
+ dbStr := strings.TrimSpace(dbRaw)
|
|
|
|
|
+ dbIdx, err := strconv.Atoi(dbStr)
|
|
|
|
|
+ if err != nil || dbIdx < 0 {
|
|
|
|
|
+ util.InfoF("skip invalid db index=%v err=%v", dbStr, err)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ dbList = append(dbList, dbIdx)
|
|
|
|
|
+ }
|
|
|
|
|
+ if len(dbList) == 0 {
|
|
|
|
|
+ util.InfoF("convert abort: no valid db in -dbs=%v", tmpDbStr)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 1) 逐个DB执行原有清洗逻辑
|
|
|
|
|
+ for idx := 0; idx < len(dbList); idx++ {
|
|
|
|
|
+ dbIdx := dbList[idx]
|
|
|
|
|
+ convertOldRedis(tmpIpStr, dbIdx, idx == len(dbList)-1, false)
|
|
|
|
|
+ util.InfoF("convert finish ip=%v db=%v", tmpIpStr, dbIdx)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2) 按dbs顺序,把后续DB合并到第一个DB
|
|
|
|
|
+ targetDB := dbList[0]
|
|
|
|
|
+ for idx := 1; idx < len(dbList); idx++ {
|
|
|
|
|
+ sourceDB := dbList[idx]
|
|
|
|
|
+ err = mergeDbIntoFirst(tmpIpStr, sourceDB, targetDB)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ util.ErrorF("merge db err source=%v target=%v err=%v", sourceDB, targetDB, err)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ util.InfoF("merge finish source=%v target=%v", sourceDB, targetDB)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3) 仅目标库执行一次持久化
|
|
|
|
|
+ convertOldRedis(tmpIpStr, targetDB, true, true)
|
|
|
|
|
+ util.InfoF("persist finish target db=%v", targetDB)
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ //tmpPortStrList := strings.Split(tmpPortStr, ",")
|
|
|
|
|
+ //for idx := 0; idx < len(tmpPortStrList); idx++ {
|
|
|
|
|
+ // ipStr := tmpIpStr + ":" + tmpPortStrList[idx]
|
|
|
|
|
+ // if idx == len(tmpPortStrList)-1 {
|
|
|
|
|
+ // convertOldRedis(ipStr, 0, true)
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // convertOldRedis(ipStr, 0, false)
|
|
|
|
|
+ // }
|
|
|
|
|
+ // util.InfoF("convert finish ipStr=%v", ipStr)
|
|
|
|
|
+ //}
|
|
|
//var ipStrList = []string{
|
|
//var ipStrList = []string{
|
|
|
// "127.0.0.1:6379",
|
|
// "127.0.0.1:6379",
|
|
|
//}
|
|
//}
|
|
@@ -81,11 +134,17 @@ func ConvertOldRedis() {
|
|
|
//}
|
|
//}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func convertOldRedis(redisIpStr string, lastOne bool) {
|
|
|
|
|
|
|
+func convertOldRedis(redisIpStr string, dbIndex int, lastOne bool, persistOnly bool) {
|
|
|
//直接获取远端redis数据,调用db接口
|
|
//直接获取远端redis数据,调用db接口
|
|
|
- //redisIpStr = "127.0.0.1:6379"
|
|
|
|
|
- cli := service.NewNetRedisConnector([]string{redisIpStr}, "", 0, 0)
|
|
|
|
|
|
|
+ cli := service.NewNetRedisConnector([]string{redisIpStr}, "", dbIndex, 0)
|
|
|
service.SetRedis(cli)
|
|
service.SetRedis(cli)
|
|
|
|
|
+ util.InfoF("convert start redis=%v db=%v lastOne=%v", redisIpStr, dbIndex, lastOne)
|
|
|
|
|
+ if persistOnly {
|
|
|
|
|
+ service.GetRedis().ConfigSet("appendonly", "yes")
|
|
|
|
|
+ service.GetRedis().BgSave()
|
|
|
|
|
+ service.GetRedis().BgRewriteAOF()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
//0.获取角色uid列表
|
|
//0.获取角色uid列表
|
|
|
uidList := getUidListFromRedis()
|
|
uidList := getUidListFromRedis()
|
|
@@ -705,7 +764,7 @@ func convertRoleRushOldCommonRedis() {
|
|
|
service.GetRedis().Del(model.RushSkillScorePrefix)
|
|
service.GetRedis().Del(model.RushSkillScorePrefix)
|
|
|
service.GetRedis().Del(model.RushSkillPrefix)
|
|
service.GetRedis().Del(model.RushSkillPrefix)
|
|
|
service.GetRedis().Del(model.RushSkillRankPrefix)
|
|
service.GetRedis().Del(model.RushSkillRankPrefix)
|
|
|
- tmpList, _ = service.GetRedis().Keys(model.RushSkillRankPrefix + "*").Result()
|
|
|
|
|
|
|
+ tmpList, _ := service.GetRedis().Keys(model.RushSkillRankPrefix + "*").Result()
|
|
|
for idx := 0; idx < len(tmpList); idx++ {
|
|
for idx := 0; idx < len(tmpList); idx++ {
|
|
|
service.GetRedis().Del(tmpList[idx])
|
|
service.GetRedis().Del(tmpList[idx])
|
|
|
}
|
|
}
|
|
@@ -792,9 +851,188 @@ func convertRoleTowerOldCommonRedis() {
|
|
|
service.GetRedis().Del(model.TowerFightpowerRankPrefix)
|
|
service.GetRedis().Del(model.TowerFightpowerRankPrefix)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func mergeDbIntoFirst(redisIpStr string, sourceDB int, targetDB int) error {
|
|
|
|
|
+ if sourceDB == targetDB {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+ cli := service.NewNetRedisConnector([]string{redisIpStr}, "", 0, 0)
|
|
|
|
|
+ service.SetRedis(cli)
|
|
|
|
|
+
|
|
|
|
|
+ if _, err := service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ keys, err := service.GetRedis().Keys("*").Result()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for idx := 0; idx < len(keys); idx++ {
|
|
|
|
|
+ key := keys[idx]
|
|
|
|
|
+
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ srcType, err := service.GetRedis().Type(key).Result()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ util.ErrorF("type err sourceDB=%v key=%v err=%v", sourceDB, key, err)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ srcTTL := int64(-1)
|
|
|
|
|
+ if ttlMs, e := service.GetRedis().Do("PTTL", key).Int64(); e == nil {
|
|
|
|
|
+ srcTTL = ttlMs
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ dstType, err := service.GetRedis().Type(key).Result()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ util.ErrorF("dst type err targetDB=%v key=%v err=%v", targetDB, key, err)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if dstType == "none" || dstType == srcType {
|
|
|
|
|
+ switch srcType {
|
|
|
|
|
+ case "hash":
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ srcMap, e := service.GetRedis().HGetAll(key).Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("hgetall err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ for field, val := range srcMap {
|
|
|
|
|
+ if e = service.GetRedis().HSet(key, field, val).Err(); e != nil {
|
|
|
|
|
+ util.ErrorF("hset merge err targetDB=%v key=%v field=%v err=%v", targetDB, key, field, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ case "set":
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ members, e := service.GetRedis().SMembers(key).Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("smembers err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if len(members) > 0 {
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ args := make([]interface{}, 0, len(members)+1)
|
|
|
|
|
+ args = append(args, key)
|
|
|
|
|
+ for _, m := range members {
|
|
|
|
|
+ args = append(args, m)
|
|
|
|
|
+ }
|
|
|
|
|
+ if e = service.GetRedis().SAdd(args...).Err(); e != nil {
|
|
|
|
|
+ util.ErrorF("sadd merge err targetDB=%v key=%v err=%v", targetDB, key, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ case "zset":
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ zitems, e := service.GetRedis().ZRangeWithScores(key, 0, -1).Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("zrange withscores err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, z := range zitems {
|
|
|
|
|
+ if e = service.GetRedis().ZAdd(key, z).Err(); e != nil {
|
|
|
|
|
+ util.ErrorF("zadd merge err targetDB=%v key=%v member=%v err=%v", targetDB, key, z.Member, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ case "list":
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ items, e := service.GetRedis().LRange(key, 0, -1).Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("lrange err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if len(items) > 0 {
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ args := make([]interface{}, 0, len(items)+1)
|
|
|
|
|
+ args = append(args, key)
|
|
|
|
|
+ for _, it := range items {
|
|
|
|
|
+ args = append(args, it)
|
|
|
|
|
+ }
|
|
|
|
|
+ if e = service.GetRedis().RPush(args...).Err(); e != nil {
|
|
|
|
|
+ util.ErrorF("rpush merge err targetDB=%v key=%v err=%v", targetDB, key, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ default:
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ dumpData, e := service.GetRedis().Do("DUMP", key).Bytes()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("dump err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ restoreTTL := int64(0)
|
|
|
|
|
+ if srcTTL > 0 {
|
|
|
|
|
+ restoreTTL = srcTTL
|
|
|
|
|
+ }
|
|
|
|
|
+ _, e = service.GetRedis().Do("RESTORE", key, restoreTTL, dumpData, "REPLACE").Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("restore err sourceDB=%v targetDB=%v key=%v err=%v", sourceDB, targetDB, key, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if srcTTL > 0 {
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ _ = service.GetRedis().Do("PEXPIRE", key, srcTTL).Err()
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", sourceDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ dumpData, e := service.GetRedis().Do("DUMP", key).Bytes()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("dump mismatch err sourceDB=%v key=%v err=%v", sourceDB, key, e)
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err = service.GetRedis().Do("SELECT", targetDB).Result(); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ dstKey := fmt.Sprintf("%s__m%d", key, sourceDB)
|
|
|
|
|
+ restoreTTL := int64(0)
|
|
|
|
|
+ if srcTTL > 0 {
|
|
|
|
|
+ restoreTTL = srcTTL
|
|
|
|
|
+ }
|
|
|
|
|
+ _, e = service.GetRedis().Do("RESTORE", dstKey, restoreTTL, dumpData, "REPLACE").Result()
|
|
|
|
|
+ if e != nil {
|
|
|
|
|
+ util.ErrorF("restore mismatch err sourceDB=%v targetDB=%v key=%v dst=%v err=%v", sourceDB, targetDB, key, dstKey, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
注意:下面操作需要在同一个redis版本中操作,即需要在外网使用的redis版本下进行操作
|
|
注意:下面操作需要在同一个redis版本中操作,即需要在外网使用的redis版本下进行操作
|
|
|
|
|
|
|
|
|
|
+新增同实例多DB模式(方案B):
|
|
|
|
|
+ test.exe -ip 127.0.0.1:6379 -dbs 0,1,2
|
|
|
|
|
+ 1.-ip 传完整redis地址(含端口)
|
|
|
|
|
+ 2.-dbs 传要处理的db索引列表,逗号分隔
|
|
|
|
|
+
|
|
|
1.获取外网rdb文件,并重新修改启动该rdb文件的redis*.conf文件
|
|
1.获取外网rdb文件,并重新修改启动该rdb文件的redis*.conf文件
|
|
|
修改conf文件如下:
|
|
修改conf文件如下:
|
|
|
1.在675行添加(表示生成的aof文件中不包行rdb文件,只有aof格式文件内容):aof-use-rdb-preamble no
|
|
1.在675行添加(表示生成的aof文件中不包行rdb文件,只有aof格式文件内容):aof-use-rdb-preamble no
|