From 416beb8d3378e59ddcd49576a7349080b489bbd7 Mon Sep 17 00:00:00 2001 From: lvxinran Date: Tue, 1 Dec 2020 10:55:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=BB=84=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamecommon/src/main/java/util/TimeUtils.java | 28 ++++-- .../com/global/GlobalServerApplication.java | 3 + .../handler/GetWorldServerRequestHandler.java | 8 +- .../main/java/com/global/redis/RedisKey.java | 4 + .../main/java/com/global/redis/RedisUtil.java | 2 + .../java/com/global/thread/MinuteTask.java | 10 ++- .../src/main/java/com/logic/GlobalLogic.java | 85 +++++++++++++++++++ .../com/ljsd/jieling/db/redis/RedisKey.java | 2 +- 8 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 globalidserver/src/main/java/com/logic/GlobalLogic.java diff --git a/gamecommon/src/main/java/util/TimeUtils.java b/gamecommon/src/main/java/util/TimeUtils.java index 3b56438ca..317ca2bcd 100644 --- a/gamecommon/src/main/java/util/TimeUtils.java +++ b/gamecommon/src/main/java/util/TimeUtils.java @@ -141,7 +141,8 @@ public class TimeUtils { int lastHour = getOverTimeCount(1599602400000L,1600462810000L,5); - System.out.println(lastHour); + long lastOrUnderHour = getLastOrUnderHour(TimeUtils.now(), 1, 0, 0, true); + System.out.println(lastOrUnderHour); } /** * 判断是否合法的时间格式(HH:mm:ss) @@ -1356,12 +1357,25 @@ public class TimeUtils { } } - /** - *获取传入时间的上个几时几分或下个几时几分 - * @param hour - * @param lastOrUnder true为上个,false为下个 - * @return - */ + + + public static long getLastOrUnderHour(long time,int week,int hour,int minute,boolean lastOrUnder) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(time); + cal.set(Calendar.DAY_OF_WEEK,week==7?0:week+1); + time = cal.getTimeInMillis(); + long lastOrUnderHour = getLastOrUnderHour(time, hour, minute, true); + if(!lastOrUnder){ + lastOrUnderHour+=TimeUtils.WEEK; + } + return lastOrUnderHour; + } + /** + *获取传入时间的上个几时几分或下个几时几分 + * @param hour + * @param lastOrUnder true为上个,false为下个 + * @return + */ public static long getLastOrUnderHour(long time,int hour,int minute,boolean lastOrUnder){ Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(time); diff --git a/globalidserver/src/main/java/com/global/GlobalServerApplication.java b/globalidserver/src/main/java/com/global/GlobalServerApplication.java index 0c90337bc..8fba5accd 100644 --- a/globalidserver/src/main/java/com/global/GlobalServerApplication.java +++ b/globalidserver/src/main/java/com/global/GlobalServerApplication.java @@ -6,6 +6,7 @@ import com.global.redis.RedisUtil; import com.global.thread.ThreadManager; import com.global.thrift.pool.GlobalRpcService; import com.global.thrift.pool.RPCServerTask; +import com.world.logic.GlobalLogic; import manager.STableManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +54,8 @@ public class GlobalServerApplication { RedisUtil.getInstence().init(); bean = ConfigurableApplicationContextManager.getBean(CoreSettings.class); LOGGER.info("ServerProperties ->{}", bean.toString()); + //启动时候分组 + GlobalLogic.getInstance().doSplit(); } diff --git a/globalidserver/src/main/java/com/global/handler/GetWorldServerRequestHandler.java b/globalidserver/src/main/java/com/global/handler/GetWorldServerRequestHandler.java index bd9f509cd..f42436bfa 100644 --- a/globalidserver/src/main/java/com/global/handler/GetWorldServerRequestHandler.java +++ b/globalidserver/src/main/java/com/global/handler/GetWorldServerRequestHandler.java @@ -2,6 +2,8 @@ package com.global.handler; import com.global.GlobalServerApplication; import com.google.protobuf.GeneratedMessage; +import com.world.logic.GlobalLogic; +import org.springframework.beans.factory.annotation.Autowired; import rpc.global.GlobalProto; import rpc.net.RpcMessage; import rpc.net.gtGBaseHandler; @@ -13,6 +15,10 @@ import rpc.net.gtGBaseHandler; */ public class GetWorldServerRequestHandler extends gtGBaseHandler { + + @Autowired + public GlobalLogic logic; + @Override public GeneratedMessage processWithProto(RpcMessage rpcMessage, GlobalProto.GetWorldServerRequest proto) throws Exception { @@ -25,7 +31,7 @@ public class GetWorldServerRequestHandler extends gtGBaseHandler splitInfo; + /** + * 分组 + */ + public void doSplit(){ + RedisUtil redisUtil = RedisUtil.getInstence(); + //这里为所有服务器的世界等级 + Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO,String.class,Integer.class); + Object matched = redisUtil.get(RedisKey.MATCHED_SPLIT_KEY); + if(matched==null){ + return; + } + LOGGER.info("Global开始分组"); + long lastHour = TimeUtils.getLastOrUnderHour(TimeUtils.now(), 1, 0, 0, true); + lastHour+=(2*TimeUtils.WEEK); + int expireTime =(int)((lastHour-TimeUtils.now())/1000); + redisUtil.set(RedisKey.MATCHED_SPLIT_KEY,String.valueOf(1),expireTime-60); + worldLevelMap.forEach((k,v)->redisUtil.zsetAddOne(RedisKey.SERVER_LEVEL_RANK,k,v)); + Set> zsetRevRangeWithScore = redisUtil.getZsetRevRangeWithScore(RedisKey.SERVER_LEVEL_RANK, 10, 999); +// int remain = zsetRevRangeWithScore.size() % 8; + int index = 0; + int areaId = 1; + Map split = new HashMap<>(zsetRevRangeWithScore.size()); + for(ZSetOperations.TypedTuple data:zsetRevRangeWithScore){ + if(index>=8){ + if(zsetRevRangeWithScore.size()-areaId*8>4){ + areaId++; + } + index=0; + } + split.put(data.getValue(),areaId); + + index++; + } + redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,split); + LOGGER.info("Global分组结束"); + splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,String.class,Integer.class); + } + + public int getSplitInfo(int serverId){ + + if(splitInfo==null){ + splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,String.class,Integer.class); + } + return splitInfo.getOrDefault(String.valueOf(serverId),-1); + } +} 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 e6d01be23..d25219dab 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 @@ -360,7 +360,7 @@ public class RedisKey { familyKey.add(FAMILY_FIGHT_TOTAL_EXP); familyKey.add(FAMILY_FIGHT_FINISH_MATCHING); } - public static String getKey(String type, String key, boolean withoutServerId) + public static String getKey(String type, String key, boolean withoutServerId){ if(RedisKey.TOKEN.equals(type)||RedisKey.USER_SERVER_INFO.equals(type)||RedisKey.SERVER_WORLDLEVE_INFO.equals(type)){ return type + RedisKey.Delimiter_colon + key; }