diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java index 39425c406..1a128885c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java @@ -331,6 +331,8 @@ public class RedisKey { public static final String SERVER_SPLIT_INFO = "SERVER_SPLIT_INFO"; + public static final String CROSS_SERVER_GROUP = "CROSS_SERVER_GROUP"; + public static final String SERVER_SPLIT_MAIL_INFO = "SERVER_SPLIT_MAIL_INFO"; // 跨服 排行 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index ab637b485..7af511f5b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -1403,7 +1403,8 @@ public class RedisUtil { RedisKey.CROSS_SERVICE_ARENA.equals(type) || RedisKey.WORLD_ARENA_RANK_MY_MATH.equals(type) || RedisKey.WORLD_ARENA_MY_PRON.equals(type) || RedisKey.WORLD_ARENA_RRECORD.equals(type) || RedisKey.TOKEN.equals(type) || RedisKey.USER_SERVER_INFO.equals(type) || - RedisKey.CDKEY.equals(type) || RedisKey.ServerArenaJob.equals(type) + RedisKey.CDKEY.equals(type) || RedisKey.ServerArenaJob.equals(type) || + RedisKey.CROSS_SERVER_GROUP.equals(type) ) { result = type + RedisKey.Delimiter_colon + key; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java index eb608ef4f..2e938ab8f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -227,8 +227,11 @@ public class GlobleSystemLogic implements IEventHandler { public static void setGloableWorldLeveCacheLine(int gloableWorldLeveCacheLine) { GLOABLE_WORLD_LEVE_CACHE_LINE = gloableWorldLeveCacheLine; - } + + /** + * 跨服分组逻辑 + */ public void doSplit(){ LOGGER.info("跨服分组验证处理"); if(!GameApplication.serverProperties.isArenaCross()){ @@ -238,10 +241,9 @@ public class GlobleSystemLogic implements IEventHandler { RedisUtil redisUtil = RedisUtil.getInstence(); Object matched = redisUtil.get(RedisKey.MATCHED_SPLIT_KEY); if(matched!=null){ - LOGGER.error("跨服分组,获取key:【MATCHED_SPLIT_KEY】失败, info:{}",matched.toString()); + LOGGER.error("跨服分组,获取key:【MATCHED_SPLIT_KEY】失败, info:{}", matched); return; } - SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); //使用分布式锁,保证只有一个服来分组 boolean lock = redisUtil.lock("SERVER_SPLIT_REDIS_LOCK", TimeUtils.ONE_MINUTE * 2); if(!lock){ @@ -251,42 +253,31 @@ public class GlobleSystemLogic implements IEventHandler { } //这里为所有服务器的世界等级 - Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO,"",String.class,Integer.class); +// Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO,"",String.class,Integer.class); + LOGGER.info("跨服开始分组"); long lastHour = TimeUtils.getLastOrUnderHour(TimeUtils.now(), 1, 0, 0, true); lastHour+=TimeUtils.WEEK; - int expireTime =(int)((lastHour-TimeUtils.now())/1000); + int expireTime =(int)(lastHour-TimeUtils.nowInt()); redisUtil.set(RedisKey.MATCHED_SPLIT_KEY,String.valueOf(1),expireTime-60); + //提前两分钟结算 redisUtil.set(RedisKey.MATCHED_VERSION,TimeUtils.getTimeStampYMD(System.currentTimeMillis()),expireTime-120); - worldLevelMap.forEach((k,v)->{ - if(v>setting.getWorldLevel()){ - redisUtil.zsetAddOne(RedisKey.SERVER_LEVEL_RANK,k,v); - }}); - Set> zsetRevRangeWithScore = redisUtil.getZsetreverseRangeByRangeWithScores(RedisKey.SERVER_LEVEL_RANK, setting.getWorldLevel(), 999); - - int index = 0; - int areaId = 1; - Map split = new HashMap<>(zsetRevRangeWithScore.size()); - for(ZSetOperations.TypedTuple data:zsetRevRangeWithScore){ - if(index>=setting.getServerNum()){ - if((zsetRevRangeWithScore.size()-areaId*setting.getServerNum())>setting.getServerNum()/2){ - areaId++; - } - index=0; - } - split.put(data.getValue(),areaId); - - index++; - } +// SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); +// worldLevelMap.forEach((k,v)->{ +// if(v>setting.getWorldLevel()){ +// redisUtil.zsetAddOne(RedisKey.SERVER_LEVEL_RANK,k,v); +// }}); + // 分组逻辑 + Map split = redisUtil.getMapValues(RedisKey.CROSS_SERVER_GROUP, "", String.class, Integer.class); redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,"",split); //发分组邮件 split.keySet().forEach(server->redisUtil.putMapEntry(RedisKey.SERVER_SPLIT_MAIL_INFO,"",server,0)); //清除分组聊天记录 - for(int i=1;i<=areaId;i++){ - redisUtil.del(RedisKey.CHAT_CROSS_INFO_CACHE+i); - redisUtil.del(RedisKey.CHAT_CROSS_MSG_ID+i); + for (Integer value : split.values()) { + redisUtil.del(RedisKey.CHAT_CROSS_INFO_CACHE+value); + redisUtil.del(RedisKey.CHAT_CROSS_MSG_ID+value); } // 重新分组,需要删除旧排行榜数据,重新分组