初步加入寻宝匹配,逻辑还不全

This commit is contained in:
liangtongchuan
2020-11-27 00:15:47 +08:00
parent 116392813e
commit 4194b1d881
4 changed files with 145 additions and 47 deletions
+65 -5
View File
@@ -1,23 +1,40 @@
import { GOOD_QUALITY } from './../consts/consts';
import { RoleModel } from "../db/Role";
import * as redis from 'redis';
import * as Redis from 'redis';
import {REDIS_KEY} from '../consts/consts'
import { GameModel } from "../db/Game";
import { exists } from "fs";
import { promisifyAll } from 'bluebird';
// 映射 redis 接口
declare module 'redis' {
export interface RedisClient extends NodeJS.EventEmitter {
hdelAsync(...args: any[]): Promise<any>;
spopAsync(...args: any[]): Promise<any>;
sremAsync(...args: any[]): Promise<any>;
srandmemberAsync(...args: any[]): Promise<any>;
}
export interface Multi extends Commands<Multi> {
execAsync(...args: any[]): Promise<any>;
}
}
let redisArr = 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com';
if(process.env.NODE_ENV == 'local') {
redisArr = '127.0.0.1';
}
// 创建 redis 连接
const client = redis.createClient(6379, redisArr, {detect_buffers: true});
client.auth('zyz_2020', (err, reply) => {
const oldRedisClient = Redis.createClient(6379, redisArr, {detect_buffers: true});
oldRedisClient.auth('zyz_2020', (err, reply) => {
if (err) {
console.log('redis err', err);
} else {
console.log('redis suc');
}
})
client.set('hello', 'redis', redis.print);
// 转 promise
const client = promisifyAll(oldRedisClient) as Redis.RedisClient;
client.set('hello', 'redis', Redis.print);
/**
* 在服务重新启动时,将信息存入redis
@@ -118,6 +135,49 @@ function decodeScoreWithTime(num: string): number {
return Math.floor(_num/pow);
}
/**************** 寻宝相关 start */
// 把寻宝的玩家信息存入 redis
export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array<number>) {
let cmds = [];
qualityArr.forEach(quality => {
if (quality) {
cmds.push(['sadd', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, `${roleId}:${sid}`]);
}
});
const multiClient = client.multi(cmds) as Redis.Multi;
const newMulti = promisifyAll(multiClient) as Redis.Multi;
const res = await newMulti.execAsync();
console.log('setTeamSearchReq: ', res);
return res;
}
// 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息
export async function getTeamSearchByQuality(quality: number) {
// TODO: 操作不具有原子性
const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2);
console.log('getTeamSearchByQuality: ' + userInfos);
if (!userInfos || !userInfos.length) return null;
let cmds = [];
let res = [];
for (let userInfo of userInfos) {
const decodeData = `${userInfo}`.split(':');
if (decodeData.length !== 2) return null;
res.push({roleId: decodeData[0], sid: decodeData[1]});
GOOD_QUALITY.forEach((q) => {
cmds.push(['srem', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`, userInfo]);
})
const multiClient = client.multi(cmds) as Redis.Multi;
const newMulti = promisifyAll(multiClient) as Redis.Multi;
await newMulti.execAsync();
}
console.log('getTeamSearchByQuality res: ', res);
return res;
}
/**************** 寻宝相关 end */
////// redis方法