redis:保存不同频道对应的sid;提取redisClient获取
This commit is contained in:
@@ -14,7 +14,7 @@ import { comBtlRanges } from '../pubUtils/gamedata';
|
||||
* 在服务重新启动时,将信息存入redis
|
||||
*/
|
||||
export async function initAllRank() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const client: Redis.RedisClient = redisClient();
|
||||
const serverList = await GameModel.getAllServerList();
|
||||
await client.delAsync(REDIS_KEY.ONLINE_USERS);
|
||||
await client.delAsync(REDIS_KEY.USER_INFO);
|
||||
@@ -35,7 +35,7 @@ export async function initAllRank() {
|
||||
*/
|
||||
export async function initRank(serverId: number) {
|
||||
// console.log('*****', 'initRank')
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const client: Redis.RedisClient = redisClient();
|
||||
await client.expireAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), 30 * 24 * 60 * 60);
|
||||
await client.expireAsync(REDIS_KEY.PVP_RANK, 30 * 24 * 60 * 60);
|
||||
await client.expireAsync(REDIS_KEY.USER_INFO, 30 * 24 * 60 * 60);
|
||||
@@ -64,9 +64,8 @@ export async function initSingleRank(key: string) {
|
||||
*/
|
||||
export async function initSingleRankWithServer(key: string, serverId: number) {
|
||||
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.delAsync(getKeyName(key, serverId));
|
||||
await client.expireAsync(key, 30 * 24 * 60 * 60);
|
||||
await redisClient().delAsync(getKeyName(key, serverId));
|
||||
await redisClient().expireAsync(key, 30 * 24 * 60 * 60);
|
||||
await setRankRedisFromDb(key, serverId);
|
||||
}
|
||||
|
||||
@@ -76,12 +75,11 @@ export async function initSingleRankWithServer(key: string, serverId: number) {
|
||||
* @param serverId 分服
|
||||
*/
|
||||
async function setRankRedisFromDb(type: string, serverId: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
if(type == REDIS_KEY.TOWER_RANK) {
|
||||
let ranks = await RoleModel.getRank('tower', serverId, ['roleId', 'roleName', 'towerLv', 'lv', 'vLv', 'headHid', 'sHid', 'title', 'updatedAt']);
|
||||
for(let {towerLv, roleId, roleName, lv, vLv, towerUpTime, headHid, sHid, title} of ranks) {
|
||||
// console.log(roleId);
|
||||
await client.zaddAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId);
|
||||
await redisClient().zaddAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId);
|
||||
let rankPram = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await redisUserInfoAdd(REDIS_KEY.USER_INFO, roleId, rankPram);
|
||||
}
|
||||
@@ -90,7 +88,7 @@ async function setRankRedisFromDb(type: string, serverId: number) {
|
||||
for(let { code, icon, name, lv, leader, activeWeekly = 0, activeUpdateTime = 0 } of ranks) {
|
||||
let _leader = <RoleType>leader;
|
||||
let { roleName, title, sHid, headHid, lv: leaderLv } = _leader;
|
||||
await client.zaddAsync(getKeyName(REDIS_KEY.GUILD_ACTIVE_RANK, serverId), encodeScoreWithTime(activeWeekly, activeUpdateTime * 1000 ), code);
|
||||
await redisClient().zaddAsync(getKeyName(REDIS_KEY.GUILD_ACTIVE_RANK, serverId), encodeScoreWithTime(activeWeekly, activeUpdateTime * 1000 ), code);
|
||||
let rankParam = new GuildRankParam(icon, name, lv, { roleName, title, sHid, headHid, lv: leaderLv });
|
||||
await redisUserInfoAdd(REDIS_KEY.GUILD_INFO, code, rankParam);
|
||||
}
|
||||
@@ -100,8 +98,7 @@ async function setRankRedisFromDb(type: string, serverId: number) {
|
||||
|
||||
// 排行榜是否存在
|
||||
export async function existsRank(key: string, serverId: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const result = await client.existsAsync(getKeyName(key, serverId));
|
||||
const result = await redisClient().existsAsync(getKeyName(key, serverId));
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -115,37 +112,34 @@ export function getKeyName(key: string, serverId?: number) {
|
||||
|
||||
// 更新玩家信息
|
||||
export async function redisUserInfoUpdate(key: string, roleId: string, arr: Array<{field: string, value:(string|number|GuildLeader)}>) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let params = await client.hgetAsync(key, roleId);
|
||||
let params = await redisClient().hgetAsync(key, roleId);
|
||||
if(params) {
|
||||
let obj = JSON.parse(params);
|
||||
for(let {field, value} of arr) {
|
||||
obj[field] = value;
|
||||
}
|
||||
return await client.hsetAsync(key, roleId, JSON.stringify(obj));
|
||||
return await redisClient().hsetAsync(key, roleId, JSON.stringify(obj));
|
||||
}
|
||||
}
|
||||
|
||||
// 添加玩家信息缓存
|
||||
export async function redisUserInfoAdd(key: string, roleId: string, params: RankParam|GuildRankParam) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let value = JSON.stringify(params);
|
||||
return await client.hsetAsync(key, roleId, value);
|
||||
return await redisClient().hsetAsync(key, roleId, value);
|
||||
}
|
||||
|
||||
// 更新排行榜, 如pvp这样跨服的,serverId传0
|
||||
export async function setRank(key: string, serverId: number, myId: string, score: number, timestamp: number, params: RankParam|GuildRankParam, limit = 100) {
|
||||
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
// 更新分数
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await client.zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
await redisClient().zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
// 移除100名以外
|
||||
await client.zremrangebyrankAsync(getKeyName(key, serverId), limit, 10000);
|
||||
await redisClient().zremrangebyrankAsync(getKeyName(key, serverId), limit, 10000);
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key);
|
||||
// 如果没有信息,更新玩家信息
|
||||
const hasCurUser = await client.hexistsAsync(infoKey, myId);
|
||||
const hasCurUser = await redisClient().hexistsAsync(infoKey, myId);
|
||||
if(!hasCurUser) {
|
||||
await redisUserInfoAdd(infoKey, myId, params);
|
||||
}
|
||||
@@ -155,16 +149,15 @@ export async function setRank(key: string, serverId: number, myId: string, score
|
||||
// 获取排行榜
|
||||
export async function getRank(key: string, serverId: number, roleId: string) {
|
||||
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let ranks = [], myRank = null;
|
||||
const rankFromDb = await client.zrevrangebyscoreAsync(getKeyName(key, serverId), '+inf', '-inf', "WITHSCORES", "LIMIT", 0, 100);
|
||||
const rankFromDb = await redisClient().zrevrangebyscoreAsync(getKeyName(key, serverId), '+inf', '-inf', "WITHSCORES", "LIMIT", 0, 100);
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key);
|
||||
|
||||
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
|
||||
const _roleId = rankFromDb[ii];
|
||||
const _score = decodeScoreWithTime(rankFromDb[ii + 1]);
|
||||
const info = await client.hgetAsync(infoKey, _roleId);
|
||||
const info = await redisClient().hgetAsync(infoKey, _roleId);
|
||||
const _userInfo = JSON.parse(info);
|
||||
const tmp = {..._userInfo, num: _score, rank: Math.floor(ii/2)+1};
|
||||
if(infoKey == REDIS_KEY.USER_INFO) {
|
||||
@@ -180,15 +173,13 @@ export async function getRank(key: string, serverId: number, roleId: string) {
|
||||
|
||||
// 获取我的排名
|
||||
export async function getMyRank(key: string, serverId: number, roleId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let myRank = await client.zrevrankAsync(getKeyName(key, serverId), roleId);
|
||||
let myRank = await redisClient().zrevrankAsync(getKeyName(key, serverId), roleId);
|
||||
return myRank + 1;
|
||||
}
|
||||
|
||||
// 获取排名第几名的信息
|
||||
export async function getFieldByRank(key: string, serverId: number, rank: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let myRank = await client.zrevrangeAsync(getKeyName(key, serverId), rank - 1, rank - 1);
|
||||
let myRank = await redisClient().zrevrangeAsync(getKeyName(key, serverId), rank - 1, rank - 1);
|
||||
return myRank;
|
||||
}
|
||||
|
||||
@@ -209,8 +200,7 @@ function decodeScoreWithTime(num: string): number {
|
||||
|
||||
// 从排行榜中移除
|
||||
export async function removeFromRank(key: string, serverId: number, myId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.zremAsync(getKeyName(key, serverId), myId);
|
||||
await redisClient().zremAsync(getKeyName(key, serverId), myId);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -246,14 +236,13 @@ function getComTeamValue(roleId: string, sid: string) {
|
||||
* @returns
|
||||
*/
|
||||
export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let cmds = [];
|
||||
qualityArr.forEach(quality => {
|
||||
if (quality) {
|
||||
cmds.push(['sadd', getComTeamKey(quality, lvRange), getComTeamValue(roleId, sid)]);
|
||||
}
|
||||
});
|
||||
const multiClient = client.multi(cmds) as Redis.Multi;
|
||||
const multiClient = redisClient().multi(cmds) as Redis.Multi;
|
||||
const newMulti = promisifyAll(multiClient) as Redis.Multi;
|
||||
const res = await newMulti.execAsync();
|
||||
console.log('setTeamSearchReq: ', res);
|
||||
@@ -270,7 +259,6 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr:
|
||||
*/
|
||||
export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
|
||||
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let cmds = [];
|
||||
for (let q of qualityArr) {
|
||||
if (lvRange) {
|
||||
@@ -281,7 +269,7 @@ export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: A
|
||||
}
|
||||
}
|
||||
};
|
||||
const multiClient = client.multi(cmds) as Redis.Multi;
|
||||
const multiClient = redisClient().multi(cmds) as Redis.Multi;
|
||||
const newMulti = promisifyAll(multiClient) as Redis.Multi;
|
||||
await newMulti.execAsync();
|
||||
}
|
||||
@@ -294,9 +282,8 @@ export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: A
|
||||
* @returns
|
||||
*/
|
||||
export async function getTeamSearchByQuality(quality: number, lvRange: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
// TODO: 操作不具有原子性
|
||||
const userInfos = await client.srandmemberAsync(getComTeamKey(quality, lvRange), 2);
|
||||
const userInfos = await redisClient().srandmemberAsync(getComTeamKey(quality, lvRange), 2);
|
||||
console.log('getTeamSearchByQuality: ' + userInfos);
|
||||
if (!userInfos || !userInfos.length) return null;
|
||||
|
||||
@@ -320,9 +307,8 @@ export async function getTeamSearchByQuality(quality: number, lvRange: number) {
|
||||
* @returns
|
||||
*/
|
||||
export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array<number>, lvRange: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
for (let quality of qualityArr) {
|
||||
let res = await client.sismemberAsync(getComTeamKey(quality, lvRange), `${roleId}:${sid}`);
|
||||
let res = await redisClient().sismemberAsync(getComTeamKey(quality, lvRange), `${roleId}:${sid}`);
|
||||
if (res) {
|
||||
return true;
|
||||
}
|
||||
@@ -335,34 +321,40 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr:
|
||||
* @export
|
||||
*/
|
||||
export async function clearComBtlQueue() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
for (let q of COM_BTL_QUALITY) {
|
||||
for (let lvRange of comBtlRanges()) {
|
||||
await client.delAsync(getComTeamKey(q, lvRange));
|
||||
await redisClient().delAsync(getComTeamKey(q, lvRange));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function setRedis(key: string, data: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
client.setAsync(key, data);
|
||||
redisClient().setAsync(key, data);
|
||||
}
|
||||
|
||||
export async function getRedis(key: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const str = await client.getAsync(key);
|
||||
const str = await redisClient().getAsync(key);
|
||||
return str;
|
||||
}
|
||||
|
||||
export async function delRedis(key: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.delAsync(key);
|
||||
await redisClient().delAsync(key);
|
||||
}
|
||||
|
||||
export function redisSidKey(roleId: string) {
|
||||
return `login_roleId_${roleId}`;
|
||||
}
|
||||
|
||||
export async function redisChannelServer(roomId: string) {
|
||||
const sid = await redisClient().hgetAsync(REDIS_KEY.ONLINE_USERS, roomId);
|
||||
return sid;
|
||||
}
|
||||
|
||||
export async function addRedisChannel(roomId: string, sid: string) {
|
||||
const result = await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roomId, sid);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家上线
|
||||
* @param roleId role表id
|
||||
@@ -370,9 +362,8 @@ export function redisSidKey(roleId: string) {
|
||||
* @param sid connector服的那个sid
|
||||
*/
|
||||
export async function roleLogin(roleId: string, userCode: string, sid: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let param = { userCode, sid };
|
||||
return await client.hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, JSON.stringify(param));
|
||||
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, JSON.stringify(param));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -380,8 +371,7 @@ export async function roleLogin(roleId: string, userCode: string, sid: string) {
|
||||
* @param roleId role表id
|
||||
*/
|
||||
export async function roleLeave(roleId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
return await client.hdelAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
return await redisClient().hdelAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,8 +379,7 @@ export async function roleLeave(roleId: string) {
|
||||
* @param roleId role表id
|
||||
*/
|
||||
export async function isRoleOnline(roleId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let result = await client.hexistsAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
let result = await redisClient().hexistsAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
return !!result;
|
||||
}
|
||||
|
||||
@@ -399,8 +388,7 @@ export async function isRoleOnline(roleId: string) {
|
||||
* @param roleId
|
||||
*/
|
||||
export async function getRoleOnlineInfo(roleId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let str = await client.hgetAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
let str = await redisClient().hgetAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||
if(str) {
|
||||
try {
|
||||
let result = JSON.parse(str);
|
||||
@@ -421,14 +409,12 @@ export async function getRoleOnlineInfo(roleId: string) {
|
||||
* 获得所有在线的玩家
|
||||
*/
|
||||
export async function getAllOnlineRoles() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let allRoles = await client.hgetallAsync(REDIS_KEY.ONLINE_USERS);
|
||||
let allRoles = await redisClient().hgetallAsync(REDIS_KEY.ONLINE_USERS);
|
||||
return allRoles;
|
||||
}
|
||||
|
||||
export async function resetPvpRanks() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.delAsync(REDIS_KEY.PVP_RANK);
|
||||
await redisClient().delAsync(REDIS_KEY.PVP_RANK);
|
||||
let { seasonNum } = await SystemConfigModel.findSystemConfig();
|
||||
console.log('execute season resetPvpRanks seasonNum = ' + seasonNum);
|
||||
let pvpRank = await PvpDefenseModel.getRank(seasonNum);//获得全服前1000名的排名,加入到redis中
|
||||
@@ -438,9 +424,9 @@ export async function resetPvpRanks() {
|
||||
continue;
|
||||
}
|
||||
let { roleName, headHid, sHid, title, lv, vLv } = role;
|
||||
await client.zaddAsync(getKeyName(REDIS_KEY.PVP_RANK), encodeScoreWithTime(score, updatedAt?updatedAt.getTime():0), roleId);
|
||||
await redisClient().zaddAsync(getKeyName(REDIS_KEY.PVP_RANK), encodeScoreWithTime(score, updatedAt?updatedAt.getTime():0), roleId);
|
||||
|
||||
const hasCurUser = await client.hexistsAsync(REDIS_KEY.USER_INFO, roleId);
|
||||
const hasCurUser = await redisClient().hexistsAsync(REDIS_KEY.USER_INFO, roleId);
|
||||
if(!hasCurUser) {
|
||||
let rankPram = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await redisUserInfoAdd(REDIS_KEY.USER_INFO, roleId, rankPram);
|
||||
@@ -450,31 +436,26 @@ export async function resetPvpRanks() {
|
||||
|
||||
// 排行榜是否存在
|
||||
export async function smembersAsync(key: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const result = await client.smembersAsync(key);
|
||||
const result = await redisClient().smembersAsync(key);
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function saddAsync(key: string, values: Array<string>) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const result = await client.saddAsync(key, values);
|
||||
const result = await redisClient().saddAsync(key, values);
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function sismemberAsync(key: string, value: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const result = await client.sismemberAsync(key, value);
|
||||
const result = await redisClient().sismemberAsync(key, value);
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function delAsync(key:string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.delAsync(key);
|
||||
await redisClient().delAsync(key);
|
||||
}
|
||||
|
||||
export async function sremAsync(key:string, member:string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.sremAsync(key, member);
|
||||
await redisClient().sremAsync(key, member);
|
||||
}
|
||||
/**************** 寻宝相关 end */
|
||||
|
||||
@@ -485,20 +466,23 @@ export async function readDataBase() {
|
||||
}
|
||||
|
||||
async function setServerList() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const serverList = await GameModel.getAllServerList();
|
||||
await client.delAsync(REDIS_KEY.DB_GAME);
|
||||
await redisClient().delAsync(REDIS_KEY.DB_GAME);
|
||||
|
||||
for(let { id, serverType, name } of serverList) {
|
||||
// console.log(roleId);
|
||||
await client.hsetAsync(REDIS_KEY.DB_GAME, `${serverType}_${id}`, name);
|
||||
await redisClient().hsetAsync(REDIS_KEY.DB_GAME, `${serverType}_${id}`, name);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getServerName(serverType: string, serverId: number) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let name = await client.hgetAsync(REDIS_KEY.DB_GAME, `${serverType}_${serverId}`);
|
||||
let name = await redisClient().hgetAsync(REDIS_KEY.DB_GAME, `${serverType}_${serverId}`);
|
||||
return name
|
||||
}
|
||||
|
||||
function redisClient() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
return client;
|
||||
}
|
||||
|
||||
/**************** 数据库表end */
|
||||
Reference in New Issue
Block a user