Parcourir la source

合服脚本修改

lt il y a 3 semaines
Parent
commit
de311a4fce

+ 1 - 0
RO_Server_Trunk-branch_0.1.39/rocommon/service/flag.go

@@ -22,4 +22,5 @@ var (
 	TestTypeParam     = ServerCmd.Int("t", 1, "test type 1登录压测 2功能压测")
 	IPParam           = ServerCmd.String("ip", "127.0.0.1:21001", "test type 1登录压测 2功能压测")
 	TypeParam         = ServerCmd.String("type", "", "操作类型")
+	DBListParam       = ServerCmd.String("dbs", "", "DB list, comma separated, e.g. 0,1,2")
 )

+ 275 - 37
RO_Server_Trunk-branch_0.1.39/roserver/test/model/combine_service.go

@@ -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进程监听地址
 	tmpIpStr := ""
 	if *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{
 	//	"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接口
-	//redisIpStr = "127.0.0.1:6379"
-	cli := service.NewNetRedisConnector([]string{redisIpStr}, "", 0, 0)
+	cli := service.NewNetRedisConnector([]string{redisIpStr}, "", dbIndex, 0)
 	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列表
 	uidList := getUidListFromRedis()
@@ -705,7 +764,7 @@ func convertRoleRushOldCommonRedis() {
 	service.GetRedis().Del(model.RushSkillScorePrefix)
 	service.GetRedis().Del(model.RushSkillPrefix)
 	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++ {
 		service.GetRedis().Del(tmpList[idx])
 	}
@@ -792,9 +851,188 @@ func convertRoleTowerOldCommonRedis() {
 	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版本下进行操作
 
+新增同实例多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文件
 	修改conf文件如下:
 		1.在675行添加(表示生成的aof文件中不包行rdb文件,只有aof格式文件内容):aof-use-rdb-preamble no