From 344d7d0803e39c5290a4c28ba43046edbabe25b2 Mon Sep 17 00:00:00 2001 From: grimm <1769111741@qq.com> Date: Tue, 20 May 2025 13:59:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=88=E6=9C=8D=E5=90=8E?= =?UTF-8?q?=E7=A6=BB=E7=BA=BF=E6=A6=9C=E5=8D=95=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/db/redis/RedisKey.java | 1 + .../logic/rankReward/RankRewardLogic.java | 104 +++++++++++++++++- 2 files changed, 104 insertions(+), 1 deletion(-) 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 d5d2c83..3a5b0b2 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 @@ -476,6 +476,7 @@ public class RedisKey { public static final String USER_SIMPLE_INFO = "USER_SIMPLE_INFO"; public static final String DEFTRAINING_RANK_MARK = "DEFTRAINING_RANK_MARK"; public static final String F5_PRE_REWARD = "F5_PRE_REWARD";//F5谷歌预注册奖励 + public static final String RANK_REWARD_SLAVE_SERVERS = "RANK_REWARD_SLAVE_SERVERS";//主服对应的从服服务器id集合,合并离线奖励用 //public static Set worldDeathPathCacChe = new HashSet<>(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rankReward/RankRewardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rankReward/RankRewardLogic.java index e0545a1..7cf9e34 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rankReward/RankRewardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rankReward/RankRewardLogic.java @@ -65,10 +65,57 @@ public class RankRewardLogic { //重置榜单结算时间顺序表,用于结算奖励时使用 this.resetTimeList(e.getType()); } - } + //处理合服数据 + this.composeServerRankReward(diff); } + /** + * 合并从服的离线结算信息到主服,合服后调用,并只执行一次 + */ + public void composeServerRankReward(int diff){ + String key = RedisKey.RANK_REWARD_SLAVE_SERVERS + RedisKey.Delimiter_colon + GameApplication.serverId; + String slaveServers = (String)RedisUtil.getInstence().get(key); + if(slaveServers == null || slaveServers.isEmpty()){ + return; + } + String[] servers = slaveServers.split(","); + if(servers.length <=0){ + return; + } + for(String server:servers){ + //是主服,不处理 + String serverId = String.valueOf(GameApplication.serverId); + if(server.equals(serverId)){ + continue; + } + for(RankRewardEunm e : RankRewardEunm.values()){ + String slaveKey = server + RedisKey.Delimiter_colon + e.getRedisKey(); + String masterKey = GameApplication.serverId + RedisKey.Delimiter_colon + e.getRedisKey(); + Map> map = RedisUtil.getInstence().getMapValues(slaveKey); + if(map != null && map.size() > 0){ + for(int time : map.keySet()){ + //失效了,不添加并清除redis信息 + if(time < diff){ + RedisUtil.getInstence().hdel(slaveKey, String.valueOf(time)); + continue; + } + Map users = map.get(time); + if(users != null && users.size() > 0){ + //添加榜单备份信息,并保存新数据到redis,但是不重置榜单结算信息,最后统重置 + this.composeAddRankMark(e.getType(),time,masterKey,users,true,false); + } + } + } + } + } + //重置时间排行榜 + for(RankRewardEunm e : RankRewardEunm.values()){ + this.resetTimeList(e.getType()); + } + //清除要合并的从服信息,防止下次再合并 + RedisUtil.getInstence().del(key); + } /** * 添加一个新的榜单备份信息 * @param type @@ -113,6 +160,60 @@ public class RankRewardLogic { } } + /** + * 合服添加榜单信息 + * @param type + * @param time + * @param users + * @param save + * @param reset + */ + public void composeAddRankMark(int type, int time, String key,Map users,boolean save,boolean reset) { + if(!rankMarks.containsKey(type)) { + Map> map = new HashMap>(); + map.put(time, users); + rankMarks.put(type, map); + if(save){ + RedisUtil.getInstence().putMap(key, String.valueOf(time),users); + } + if(reset){ + this.resetTimeList(type); + } + return; + } + Map> map = rankMarks.get(type); + if(map == null) { + map = new HashMap>(); + map.put(time, users); + rankMarks.put(type, map); + if(save){ + RedisUtil.getInstence().putMap(key, String.valueOf(time),users); + } + if(reset){ + this.resetTimeList(type); + } + return; + } + if(map.containsKey(time)){//同一个时间key,合并数据,并保存合并后的users + Map masterUsers = map.get(time); + if(masterUsers == null){ + masterUsers = new HashMap(); + } + masterUsers.putAll(users); + if(save){ + RedisUtil.getInstence().putMap(key, String.valueOf(time),masterUsers); + } + }else{ + map.put(time, users); + if(save){ + RedisUtil.getInstence().putMap(key, String.valueOf(time),users); + } + } + if(reset){ + this.resetTimeList(type); + } + } + /** * 检查榜单是否有效,及时删除 */ @@ -200,6 +301,7 @@ public class RankRewardLogic { return null; } + /** * 结算榜单奖励 * @param user