redis get 개선

nn·2023년 3월 12일
  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으로 설정해주었다.

profile
내가 될 거라고 했잖아

0개의 댓글