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

Redis 프리티어의 제공 용량은 30MB, 최근 30개의 채팅기록을 관리한다 가정하고 계산해본 결과.
채팅방 수=52,429(메세지)/30≈1,748개
최근 5일 내로 활성화되지 않은 채팅방을 제거하는 규칙을 추가하여 관리한다면, 괜찮게 사용할 수 있을 것으로 보인다.
일단 진행해보자.
LPUSH 및 LTRIM 그리고 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);
}
전체 채팅내역 불러오기

채팅 페이징 처리 이후

캐시 측 데이터가 부족할 경우 (오히려 느려짐)
