개요

Redis를 활용하여 최근 데이터를 관리하는 메모리로써 활용하기 위한 방법을 정리한다.

Untitled

Redis 프리티어의 제공 용량은 30MB, 최근 30개의 채팅기록을 관리한다 가정하고 계산해본 결과.

채팅방 수=52,429(메세지)/30≈1,748개

최근 5일 내로 활성화되지 않은 채팅방을 제거하는 규칙을 추가하여 관리한다면, 괜찮게 사용할 수 있을 것으로 보인다.

일단 진행해보자.

Redis의 자료구조

LPUSHLTRIM 그리고 EXPIRE


const TTL_SECONDS = 5 * 24 * 60 * 60; // 5일
const EXPIRY_TIME_THRESHOLD = 3600 * 1000; // 1시간 (밀리초 단위)
...
...
  let message:any = await Message.create(newMessage);
  message = await message.populate("sender", "nickname pic");

  const cacheData = {
    sender : message.sender,
    content,
    createdAt : message.createdAt
  }

  try {
    const lastMessage = await redisClient.lRange(`room:${chatId}`, 0, 0);
    if (lastMessage.length > 0) {
      const lastM:any = JSON.parse(lastMessage[0]);
      const lastMTime = lastM.createdAt;
      const timeDifference = message.createdAt - lastMTime; //Date 간의 연산은 밀리초 단위로 계산됨.
      if (timeDifference >= EXPIRY_TIME_THRESHOLD) {
          await redisClient.expire(`room:${chatId}`, TTL_SECONDS);
      }
    } else {
      await redisClient.expire(`room:${chatId}`, TTL_SECONDS);
    }

    const result = await redisClient.lPush(`room:${chatId}`, JSON.stringify(cacheData));
    console.log(`Message added to room ${chatId}:`, result);
    await redisClient.lTrim(`room:${chatId}`, 0, 29);
  } catch (err) {
      console.error('Error:', err);
  }

성능 테스트