redis存储队伍英雄模板id,优化部分地方读取用户逻辑,避免批量读取数据库

master_otnew
PC-202302260912\Administrator 2023-11-28 15:58:48 +08:00
parent 7d52ab08a1
commit 825a5cb3ca
6 changed files with 96 additions and 128 deletions

View File

@ -113,6 +113,7 @@ public class CrossServiceLogic {
csPlayer.setLoginTime(p.getLoginTime());
csPlayer.setOffLineTime(p.getOffLineTime());
csPlayer.setMaxFore(p.getMaxForce());
//玉虚三个队伍总战力
long force1 = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.CROSS_YU_XU_LUN_DAO_ONE.getTeamId());
long force2 = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.CROSS_YU_XU_LUN_DAO_TWO.getTeamId());
@ -122,8 +123,15 @@ public class CrossServiceLogic {
long mainLine = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.MIAN_LINE_TEAM.getTeamId());
csPlayer.setMainLineForce(mainLine);
// 罗浮编队战力
long luoFu = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.MIAN_LINE_TEAM.getTeamId());
long luoFu = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.WORLD_TEAM_ARENA_DEFENSE.getTeamId());
csPlayer.setLuoFuForce(luoFu);
// 编队英雄记录
List<Integer> mianLineTeam = HeroLogic.getInstance().getTeamByUid(user, TeamEnum.MIAN_LINE_TEAM.getTeamId());
csPlayer.putTeamHeroIds(TeamEnum.MIAN_LINE_TEAM.getTeamId(), mianLineTeam);
List<Integer> arenaDefenseTeam = HeroLogic.getInstance().getTeamByUid(user, TeamEnum.TEAM_ARENA_DEFENSE.getTeamId());
csPlayer.putTeamHeroIds(TeamEnum.TEAM_ARENA_DEFENSE.getTeamId(), arenaDefenseTeam);
return csPlayer;
}

View File

@ -412,13 +412,12 @@ public class ArenaLogic {
}
public void getWorldRankByPage(ISession session, int page) throws Exception {
public void getWorldRankByPage(ISession session, int page) {
if (page == 0) {
page = 1;
}
int start = (page - 1) * 20, end = page * 20 - 1;
List<CommonProto.ArenaEnemy> arenaRankMemberInfo = new ArrayList<>(20);
// todo 这里会批量请求其他玩家缓存,需要处理
int rankEndLine = SSpecialConfig.getIntegerValue(SSpecialConfig.ARENA_RANKINGSHOWNUM);
if (end < rankEndLine) {
Set<ZSetOperations.TypedTuple<String>> arenaRankInfo = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.ARENA_RANK, Integer.toString(viewSeason), start, end);
@ -426,34 +425,26 @@ public class ArenaLogic {
String value = item.getValue();
int score = item.getScore().intValue();
int uid = Integer.parseInt(value);
User user = UserManager.getUser(uid, true);
if (null == user) {
CSPlayer csPlayer = CrossServiceLogic.getPlayerByRedis(uid);
if (null == csPlayer) {
continue;
}
long totalForce = HeroLogic.getInstance().calTeamTotalForce(user, TeamEnum.TEAM_ARENA_DEFENSE.getTeamId());
// LOGGER.info("获取世界排行榜信息===========玩家id{}", uid);
List<TeamPosHeroInfo> teamPosHeroInfoList = user.getTeamPosManager().getTeamPosForHero().get(TeamEnum.TEAM_ARENA_DEFENSE.getTeamId());
Map<String, Hero> heroMap = user.getHeroManager().getHeroMap();
List<Integer> heroTids = new ArrayList<>(teamPosHeroInfoList.size());
for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfoList) {
heroTids.add(heroMap.get(teamPosHeroInfo.getHeroId()).getTemplateId());
}
List<Integer> heroTids = csPlayer.getTeamHeroId(TeamEnum.TEAM_ARENA_DEFENSE.getTeamId());
CommonProto.Team teamBuild = CommonProto.Team.newBuilder().addAllHeroTid(heroTids).build();
PlayerManager playerInfoManager = user.getPlayerInfoManager();
CommonProto.ArenaPersonInfo personInfoBuild = CommonProto.ArenaPersonInfo.newBuilder()
.setUid(uid)
.setLevel(playerInfoManager.getLevel())
.setName(playerInfoManager.getNickName())
.setLevel(csPlayer.getLevel())
.setName(csPlayer.getName())
.setScore(score)
.setHead(playerInfoManager.getHead())
.setHead(csPlayer.getHead())
.setRank(++start)
.setTotalForce(totalForce)
.setHeadFrame(playerInfoManager.getHeadFrame())
.setUserMount(playerInfoManager.getUserMount())
.setUserSkin(playerInfoManager.getUserSkin())
.setUserTitle(playerInfoManager.getUserTitle())
.setGender(playerInfoManager.getSex())
.setPracticeLevel(user.getHeroManager().getPracticeLevel())
.setTotalForce(csPlayer.getMainLineForce())
.setHeadFrame(csPlayer.getHeadFrame())
.setUserMount(csPlayer.getUserMount())
.setUserSkin(csPlayer.getSkin())
.setUserTitle(csPlayer.getUserTitle())
.setGender(csPlayer.getSex())
.setPracticeLevel(csPlayer.getPracticeLevel())
.build();
arenaRankMemberInfo.add(CommonProto.ArenaEnemy.newBuilder()
.setPersonInfo(personInfoBuild)
@ -1035,7 +1026,7 @@ public class ArenaLogic {
.setLevel(csPlayer.getLevel())
.setName(csPlayer.getName())
.setServername(serverName)
.setTotalForce(csPlayer.getLuoFuForce())
.setTotalForce(csPlayer.getMainLineForce())
.setUserTitle(csPlayer.getUserTitle())
.setUserMount(csPlayer.getUserMount())
.setGender(csPlayer.getSex())

View File

@ -2,6 +2,11 @@ package com.ljsd.jieling.logic.dao.cross;
import com.ljsd.jieling.db.mongo.AreaManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author hj
* @Date 2021/8/31 15:30:04
@ -9,87 +14,31 @@ import com.ljsd.jieling.db.mongo.AreaManager;
* @Version 1.0
*/
public class CSPlayer {
/**
* id
*/
private int userId;
/**
*
*/
private int level;
/**
*
*/
private String name;
/**
*
*/
private int head;
/**
*
*/
private int headFrame;
/**
*
*/
private int skin;
/**
*
*/
private int userTitle;
/**
*
*/
private int practiceLevel;
/**
* id
*/
private int serverId;
/**
*
*/
private int sex;
/**
*
*/
private int userMount;
/**
* id
*/
private int guildId;
/**
*
*/
private long maxFore;
/**
*
*/
private int crossYuxulundaoOldScore = 0;
/**
*
*/
private int crossYuxulundaoNewScore = 0;
/**
*
*/
private int crossYxldMaxLevel = 0 ;
private long mainLineForce = 0;
private long luoFuForce = 0;
private long yuxuForce = 0;
private int userId;//角色id
private int level;//等级
private String name;//名字
private int head;//头像
private int headFrame;//头像框
private int skin;//皮肤
private int userTitle;//称号
private int practiceLevel;//修行等级
private int serverId;//服务器id
private int sex;//性别
private int userMount;//坐骑
private int guildId;//公会id
private long maxFore;//最高战力
private int crossYuxulundaoOldScore;//玉虚论道旧分数
private int crossYuxulundaoNewScore;//玉虚论道最新分数
private int crossYxldMaxLevel;//玉虚论道历史达到的最高等级
private long mainLineForce;
private long luoFuForce;
private long yuxuForce;
private long loginTime;// 登陆时间
private long offLineTime;// 离线时间
// 数字小游戏
private int compareNumLevelId;
private int compareNumLevelTime;
private Map<Integer, List<Integer>> teamHeroIdMap = new HashMap<>();// 队伍内的英雄模板id
public CSPlayer() {
}
@ -277,4 +226,20 @@ public class CSPlayer {
public void setYuxuForce(long yuxuForce) {
this.yuxuForce = yuxuForce;
}
public Map<Integer, List<Integer>> getTeamHeroIdMap() {
return teamHeroIdMap;
}
public List<Integer> getTeamHeroId(int teamId) {
return teamHeroIdMap.getOrDefault(teamId, new ArrayList<>(0));
}
public void setTeamHeroIdMap(Map<Integer, List<Integer>> teamHeroIdMap) {
this.teamHeroIdMap = teamHeroIdMap;
}
public void putTeamHeroIds(int teamId, List<Integer> heroTIds) {
this.teamHeroIdMap.put(teamId, heroTIds);
}
}

View File

@ -3561,7 +3561,7 @@ public class HeroLogic {
// 更新战力
Poster.getPoster().dispatchEvent(new SaveHeroForceEvent(user.getId(),heroId));
// 鸿蒙阵,穿装备
addOrUpdateHongmeng(session);
// addOrUpdateHongmeng(session);
//发送成功消息
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.EQUIP_WEAR_RESPONSE_VALUE, null, true);
@ -7040,4 +7040,24 @@ public class HeroLogic {
return potentialNew.getAttribute();
}
/**
* id
*/
public List<Integer> getTeamByUid(User user, int teamId){
ArrayList<Integer> result = new ArrayList<>();
if (user == null){
return result;
}
List<TeamPosHeroInfo> heroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId);
if (heroInfos == null || heroInfos.isEmpty()){
return result;
}
for (TeamPosHeroInfo heroInfo : heroInfos) {
// 获取英雄模板id
Hero hero = user.getHeroManager().getHero(heroInfo.getHeroId());
result.add(hero.getTemplateId());
}
return result;
}
}

View File

@ -6,7 +6,9 @@ import com.ljsd.jieling.globals.BIReason;
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.*;
import com.ljsd.jieling.logic.dao.cross.CSPlayer;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank;
import com.ljsd.jieling.network.session.ISession;
@ -105,7 +107,6 @@ public class RankLogic {
/**
* id
* todo
*/
public List<List<Integer>> getRandomUserByRank(User user,int counts) throws Exception {
List<List<Integer>> result = new ArrayList<>();
@ -128,14 +129,14 @@ public class RankLogic {
// 随机排名
int random = MathUtils.randomInt(rankSize);
// 获取随机玩家的主线队伍阵容
User other1 = getRankUid(rankResponse, random);
List<Integer> heroInfos = getTeamByUid(other1);
CSPlayer player = getRankUid(rankResponse, random);
List<Integer> heroInfos = player.getTeamHeroId(TeamEnum.MIAN_LINE_TEAM.getTeamId());
// 队伍长度不足六人
if (heroInfos.size() < 6){
if (count == 5){
// 最多循环五次五次之后直接取第一名得id
User other2 = getRankUid(rankResponse, 0);
result.add(getTeamByUid(other2));
CSPlayer player2 = getRankUid(rankResponse, 0);
result.add(player2.getTeamHeroId(TeamEnum.MIAN_LINE_TEAM.getTeamId()));
}
count++;
}else {
@ -147,29 +148,12 @@ public class RankLogic {
return result;
}
/**
* id
*/
private List<Integer> getTeamByUid(User user){
ArrayList<Integer> integers = new ArrayList<>();
if (user == null){
return integers;
}
List<TeamPosHeroInfo> heroInfos = user.getTeamPosManager().getTeamPosForHero().get(TeamEnum.MIAN_LINE_TEAM.getTeamId());
heroInfos.forEach(v->{
// 获取英雄模板id
Hero hero = user.getHeroManager().getHero(v.getHeroId());
integers.add(hero.getTemplateId());
});
return integers;
}
/**
* id
*/
private User getRankUid(PlayerInfoProto.RankResponse rankResponse, int ranking){
private CSPlayer getRankUid(PlayerInfoProto.RankResponse rankResponse, int ranking){
CommonProto.UserRank ranks = rankResponse.getRanks(ranking);
return UserManager.getUserNotCache(ranks.getUid());
return CrossServiceLogic.getPlayerByRedis(ranks.getUid());
}
/**

View File

@ -78,7 +78,7 @@ public class CrossArenaRank extends AbstractRank {
}
CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder()
.setRank(index)
.setParam1(query.getLuoFuForce())
.setParam1(query.getMainLineForce())
.setParam2(getParam2(data.getScore()))
.setParam3(getParam3(data.getScore()));
CommonProto.UserRank.Builder everyRank = getCrossOneUserRank(query,everyRankInfo);
@ -89,7 +89,7 @@ public class CrossArenaRank extends AbstractRank {
@Override
public CommonProto.UserRank.Builder getCrossOneUserRank(CSPlayer csPlayer, CommonProto.RankInfo.Builder everyRankInfo){
CommonProto.UserRank.Builder oneUserRank = super.getCrossOneUserRank(csPlayer, everyRankInfo);
oneUserRank.setForce(csPlayer.getLuoFuForce());
oneUserRank.setForce(csPlayer.getMainLineForce());
return oneUserRank;
}