From 5c70df47dbe674d9c80a7d047c8a7e416bc31096 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 4 Nov 2021 10:11:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=A8=E6=9C=8D=E5=88=86=E7=BB=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/db/redis/RedisKey.java | 6 ++-- .../com/ljsd/jieling/db/redis/RedisUtil.java | 22 ++++++------ .../ljsd/jieling/logic/GlobleSystemLogic.java | 26 ++++++++++++-- .../jieling/logic/rank/CrossRankManager.java | 36 +++++++++++++------ .../logic/sevenworld/SevenWorldLogic.java | 1 - .../ljsd/jieling/thread/task/MinuteTask.java | 4 +-- 6 files changed, 64 insertions(+), 31 deletions(-) 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 4e395336c..1896b5360 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 @@ -1,8 +1,5 @@ package com.ljsd.jieling.db.redis; -import com.ljsd.jieling.db.mongo.AreaManager; -import com.ljsd.jieling.logic.GlobleSystemLogic; - import java.util.HashSet; import java.util.Set; @@ -356,7 +353,8 @@ public class RedisKey { public static final String GUILD_LEADER_CACHE = "GUILD_LEADER_CACHE"; - public static final String CROSS_RANK_UPDATE_VERSION = "CROSS_RANK_UPDATE_VERSION"; + public static final String CROSS_RANK_UPDATE = "CROSS_RANK_UPDATE"; + public static final String CROSS_RANK_DELETE = "CROSS_RANK_DELETE"; //玉虚论道 public static final String CROSS_YUXULUNDAO_RANK = "CROSS_YUXULUNDAO_RANK";//排行榜信息 废弃 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 06baa0356..7d90c1f13 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 @@ -1429,27 +1429,27 @@ public class RedisUtil { if (result == null){ result = AreaManager.areaId + RedisKey.Delimiter_colon + type + RedisKey.Delimiter_colon + key; } - deathPathKeyHandler(result); - helpHeroKeyHandler(result); - + // 保存需要清理的key + saveRemoveKeyHandler(result); return result;} /** - * 十绝阵rediskey处理 + * 保存需要清理的key */ - private void deathPathKeyHandler(String key){ + private void saveRemoveKeyHandler(String key){ + // 十绝阵相关 if(key.contains("DEATH_PATH")){ RedisUtil.getInstence().sSet(RedisKey.DEATH_PATH_DELETE,key); } - } - - /** - * 助战rediskey处理 - */ - private void helpHeroKeyHandler(String key){ + // 助战相关 if(key.contains("HELP_FIGHT")){ RedisUtil.getInstence().sSet(RedisKey.HELP_FIGHT_DELETE,key); } + // 跨服排行榜相关 + if(key.contains("CROSS_RANK_UPDATE")){ + RedisUtil.getInstence().sSet(RedisKey.CROSS_RANK_DELETE,key); + } + } private static final String LOCK_SUCCESS = "OK"; 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 6d2a6a400..17390e2b5 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -285,13 +285,20 @@ public class GlobleSystemLogic implements IEventHandler { redisUtil.del(RedisKey.CHAT_CROSS_MSG_ID+i); } + // 重新分组,需要删除旧排行榜数据,重新分组 + redisUtil.delVague(RedisKey.CROSS_RANK_DELETE,"CROSS_RANK_UPDATE:.*"); + //释放分布式锁 redisUtil.del("SERVER_SPLIT_REDIS_LOCK"); LOGGER.info("跨服分组结束"); // splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,"",String.class,Integer.class); } - //获取当前区服的跨服区组 -1为未在分组内 + + /** + * 获取当前区服的跨服区组 -1为未在分组内 + * @return + */ public int getCrossGroup(){ //测试服不参与分组和跨服 if(!GameApplication.serverProperties.isArenaCross()){ @@ -299,8 +306,23 @@ public class GlobleSystemLogic implements IEventHandler { } Integer group = RedisUtil.getInstence().getMapValue(RedisKey.SERVER_SPLIT_INFO, "", String.valueOf(GameApplication.serverId), Integer.class); crossGroup = group==null?-1:group; + return crossGroup; + } - return crossGroup; + /** + * 获取和当前分组同一分组的服务器id + * @return + */ + public List getCrossServersByGroup(){ + int group = getCrossGroup(); + Map values = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, "", String.class, Integer.class); + ArrayList list = new ArrayList<>(); + for (Map.Entry entry : values.entrySet()) { + if (entry.getValue() == group){ + list.add(entry.getKey()); + } + } + return list; } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java index bb46ad155..bef2f70c7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java @@ -1,5 +1,6 @@ package com.ljsd.jieling.logic.rank; +import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.dao.GuilidManager; @@ -11,6 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ZSetOperations; import util.TimeUtils; +import java.util.List; import java.util.Map; import java.util.Set; @@ -45,7 +47,7 @@ public class CrossRankManager { /** * 跨服排行处理 */ - public void crossRankHandle(boolean choice){ + public void crossRankHandle(){ // 时间验证 if (isTime()){ // 全部排行遍历 @@ -57,11 +59,20 @@ public class CrossRankManager { int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup(); if(crossGroup != -1){ AbstractRank rank = RankContext.getRankEnum(type); - // 获取本服排行榜数据 - Set> range = RedisUtil.getInstence().getZsetreverseRangeWithScores(rank.getRedisKey(), "", 0, 100, true); - // 批量放入跨服排行榜 + // 获取跨服key String key = RedisUtil.getInstence().getKey(rank.getCrossRedisKey(),"",false); - RedisUtil.getInstence().zsetAddAall(key,range); + // 清理旧榜数据 + RedisUtil.getInstence().del(key); + // 获取本组的服务器列表 + List servers = GlobleSystemLogic.getInstence().getCrossServersByGroup(); + for (String server : servers) { + String localKey = RedisUtil.getInstence().getKey(server, rank.getRedisKey(), false); + // 获取本地服排行榜数据 + Set> range = + RedisUtil.getInstence().getZsetreverseRangeWithScores(localKey,"",0,100, false); + // 批量放入跨服排行榜 + RedisUtil.getInstence().zsetAddAall(key,range); + } LOGGER.info("=====================跨服排行榜处理========,key:{}",key); } } @@ -74,14 +85,17 @@ public class CrossRankManager { * @return */ private boolean isTime(){ - long now = TimeUtils.now(); - long twoHour = TimeUtils.HOUR * 2; - if (now >= twoHour+time){ - time = now; - return true; - }else{ + int group = GlobleSystemLogic.getInstence().getCrossGroup(); + if (group == -1){ return false; } + String key = RedisUtil.getInstence().getKey(RedisKey.CROSS_RANK_UPDATE, String.valueOf(group), false); + Object object = RedisUtil.getInstence().get(key); + if (object != null){ + return false; + } + RedisUtil.getInstence().set(key,"1",TimeUtils.HOUR * 2); + return true; } /** diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java index ed973c79e..673bf18d1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java @@ -11,7 +11,6 @@ import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.ktbeans.ReportEventEnum; import com.ljsd.jieling.ktbeans.ReportUtil; import com.ljsd.jieling.logic.GlobleSystemLogic; -import com.ljsd.jieling.logic.activity.crossService.CrossServiceLogic; import com.ljsd.jieling.logic.dao.Hero; import com.ljsd.jieling.logic.dao.TeamEnum; import com.ljsd.jieling.logic.dao.TeamPosHeroInfo; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index b26853c17..c2b28460b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -163,10 +163,10 @@ public class MinuteTask extends Thread { } try { - CrossRankManager.getInstance().crossRankHandle(false); + CrossRankManager.getInstance().crossRankHandle(); }catch (Exception e){ e.printStackTrace(); - LOGGER.error("跨服排行榜初始化一次,Exception::=>{}",e.toString()); + LOGGER.error("跨服排行榜初始化异常,Exception::=>{}",e.toString()); } try {