redis 排行榜分区

This commit is contained in:
luying
2020-11-23 16:29:21 +08:00
parent d8e2c609cb
commit aa5dc07b86
8 changed files with 72 additions and 23 deletions
+2 -2
View File
@@ -47,7 +47,7 @@ export async function checkTowerWar(roleId: string, battleId: number, heroes: Ar
}};
}
export async function towerBattleEnd(channelService: ChannelService, sid: string, roleId: string, battleCode: string, battleId: number, succeed: boolean, heroes: Array<number>) {
export async function towerBattleEnd(channelService: ChannelService, sid: string, roleId: string, serverId: number, battleCode: string, battleId: number, succeed: boolean, heroes: Array<number>) {
if (succeed) {
let battleRec = await BattleRecordModel.getBattleRecordByCode(battleCode);
if (battleRec.battleId != battleId) {
@@ -73,7 +73,7 @@ export async function towerBattleEnd(channelService: ChannelService, sid: string
let role = await RoleModel.towerLvUp(roleId);
// 更新redis
let { roleName, towerLv, towerUpTime, lv, vLv } = role;
await setRank(REDIS_KEY.TOWER_RANK, roleId, towerLv, towerUpTime.getTime(), {roleName, lv, vLv, guildName:"", head: "zhaoyun"});
await setRank(REDIS_KEY.TOWER_RANK, serverId, roleId, towerLv, towerUpTime.getTime(), {roleName, lv, vLv, guildName:"", head: "zhaoyun"});
const nextTowerInfo = getTowerDataByLv(towerLv + 1);
if (nextTowerInfo) {
+45 -11
View File
@@ -1,6 +1,8 @@
import { RoleModel } from "../db/Role";
import * as redis from 'redis';
import {REDIS_KEY} from '../consts/consts'
import { GameModel } from "../db/Game";
import { exists } from "fs";
let redisArr = 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com';
if(process.env.NODE_ENV == 'local') {
@@ -20,16 +22,38 @@ client.set('hello', 'redis', redis.print);
/**
* 在服务重新启动时,将信息存入redis
*/
export async function initRank() {
await redisDel(REDIS_KEY.TOWER_RANK); // 清空天梯排行榜(ZSet)
await redisDel(REDIS_KEY.USER_INFO); // 清空用户缓存信息
let ranks = await RoleModel.getRank('tower', ['roleId', 'roleName', 'towerLv', 'lv', 'vLv']);
export async function initAllRank() {
const serverList = await GameModel.getAllServerList();
await redisDel(REDIS_KEY.USER_INFO);
for(let {id} of serverList) {
await redisDel(getKeyName(REDIS_KEY.TOWER_RANK, id));
await initRank(id);
}
}
export async function initRank(serverId: number) {
console.log('*****', 'initRank')
await redisExpire(getKeyName(REDIS_KEY.TOWER_RANK, serverId), 30 * 24 * 60 * 60);
await redisExpire(REDIS_KEY.USER_INFO, 30 * 24 * 60 * 60);
let ranks = await RoleModel.getRank('tower', serverId, ['roleId', 'roleName', 'towerLv', 'lv', 'vLv']);
for(let {towerLv, roleId, roleName, lv, vLv, towerUpTime} of ranks) {
await redisZadd(REDIS_KEY.TOWER_RANK, encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId);
console.log(roleId);
await redisZadd(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId);
await redisUserInfoAdd(roleId, {roleName, lv, vLv, guildName:"", head: "zhaoyun"});
}
}
// 排行榜是否存在
export async function existsRank(key: string, serverId: number) {
const result = await redisExists(getKeyName(key, serverId));
return result;
}
export function getKeyName(key: string, serverId: number) {
return `${key}:${serverId.toString()}`;
}
// 更新玩家信息
export async function redisUserInfoUpdate(roleId: string, arr: Array<{field: string, value:(string|number)}>) {
let params = await redisHget(REDIS_KEY.USER_INFO, roleId);
@@ -49,12 +73,12 @@ export async function redisUserInfoAdd(roleId: string, params: {roleName: string
}
// 更新排行榜
export async function setRank(key: string, roleId: string, score: number, timestamp: number, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) {
export async function setRank(key: string, serverId: number, roleId: string, score: number, timestamp: number, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) {
// 更新分数
const _score = encodeScoreWithTime(score, timestamp);
await redisZadd(key, _score, roleId);
await redisZadd(getKeyName(key, serverId), _score, roleId);
// 移除100名以外
await redisZremRangeByRank(key, 0, 100);
await redisZremRangeByRank(getKeyName(key, serverId), 100, 10000);
// 如果没有信息,更新玩家信息
const hasCurUser = await redisHexists(REDIS_KEY.USER_INFO, roleId);
if(!hasCurUser) {
@@ -64,15 +88,15 @@ export async function setRank(key: string, roleId: string, score: number, timest
}
// 获取排行榜
export async function getRank(key: string, roleId: string) {
export async function getRank(key: string, serverId: number, roleId: string) {
let ranks = [], myRank = null;
const rankFromDb = await redisZrevrangeByScore(key, '+inf', '-inf', true, 100);
const rankFromDb = await redisZrevrangeByScore(getKeyName(key, serverId), '+inf', '-inf', true, 100);
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
const _roleId = rankFromDb[ii];
const _score = decodeScoreWithTime(rankFromDb[ii + 1]);
const userInfo = await redisHget(REDIS_KEY.USER_INFO, _roleId);
const _userInfo = JSON.parse(userInfo);
const tmp = {..._userInfo, roleId: _roleId, num: _score, rank: ii%2+1}
const tmp = {..._userInfo, roleId: _roleId, num: _score, rank: Math.floor(ii/2)+1}
ranks.push(tmp);
if(roleId == _roleId) myRank = tmp;
}
@@ -99,11 +123,21 @@ function decodeScoreWithTime(num: string): number {
//// key
// key 是否存在。
export async function redisExists(key: string) {
return await createPromise('exists', [key]);
}
// 在 key 存在时删除 key。
export async function redisDel(key: string) {
return await createPromise('del', [key]);
}
// 设置过期时间
export async function redisExpire(key: string, seconds: number) {
return await createPromise('expire', [key, seconds]);
}
//// 有序集合
// 返回有序集中指定分数区间内的成员,分数从高到低排序