findMemberSessions: async (userIDs: number[]): Promise<any> => {
const userId = userIDs.map((userId) =>
redisClient
.get(`user:${userId}`)
.then((res) => {
if (!res) {
return null;
}
return JSON.parse(res).sessionID;
})
.then((session) => {
if (!session) {
return null;
}
return redisClient.get(`session:${session}`).then((res) => res);
})
);
const results = await Promise.all(userId);
return results.filter((result) => result !== null);
},
사용자와 같은 채널에 속한 유저들의 세션 정보를 redis에서 얻어오는 함수이다.
여러번 호출되는 get함수를 mget함수를 사용해 한번의 호출만으로 개선할 수 있다는 것을 알게 되었다.
mget은 여러개의 데이터를 한꺼번에 가져올 수 있는 명령어다.
유저의 키를 mget을 통해 한꺼번에 redis에서 가져오고, 세션 키로 promise 배열을 생성해서 Promise.all로 한번에 반환했다.
private static async findMemberSessionIDs(
userIDs: number[]
): Promise<string[]> {
const keys = userIDs.map(
(userID) => `${RedisHandler.USER_PREFIX}${userID}`
);
const sessionKeys = await redisClient.mGet(keys);
return sessionKeys
.map((res) => (res ? JSON.parse(res).sessionID : null))
.filter((sessionID) => sessionID);
}
static async findMemberSessions(userIDs: number[]): Promise<string[]> {
const sessionIDs = await this.findMemberSessionIDs(userIDs);
...생략
}
데이터베이스 관련 함수들은 전역에서 사용할 수 있도록 static으로 설정해주었다.