Redis의 대표적인 활용 사례
KUKJIN LEE • 3주 전 작성
캐싱 (Caching)
-
페이지/콘텐츠 캐싱: 웹페이지나 API 응답 결과를 Redis에 캐싱해 서버 부하를 줄이고 응답 속도를 개선한다.
-
데이터베이스 쿼리 결과 캐싱: SQL 질의 결과를 Redis에 임시 저장한 뒤, 동일한 요청이 들어올 때 Redis에서 바로 결과를 반환함으로써 DB 부하 및 응답 지연을 낮출 수 있다.
const { createClient } = require('redis');
(async () => {
const client = createClient();
await client.connect();
const userId = "kakaogg";
const cacheKey = `user_info:${userId}`;
// 캐시 조회
const cachedData = await client.get(cacheKey);
if (cachedData) {
console.log("캐시에서 사용자 정보 반환:", cachedData);
} else {
// 캐시에 데이터가 없으므로 DB에서 가져온다고 가정
const userInfo = { name: "홍길동", age: 30 };
// Redis에 캐싱 (예: TTL 1시간)
await client.setEx(cacheKey, 3600, JSON.stringify(userInfo));
console.log("DB에서 가져온 사용자 정보 캐싱 후 반환:", userInfo);
}
await client.disconnect();
})();
세션(Session) 관리
-
웹 애플리케이션 세션 저장소: 상태, 쇼핑 카트 정보 등 세션 데이터를 Redis에 저장하면, 다중 서버 환경에서도 세션 정보를 공유하기 쉽다. TTL을 활용해 세션 만료 관리도 간편하다.
const { createClient } = require('redis');
(async () => {
const client = createClient();
await client.connect();
const sessionId = "session_kakaogg";
const sessionData = { user_id: "kakaogg", cart: ["item1", "item2"] };
// 세션 데이터 저장 및 TTL 설정(예: 30분 = 1800초)
await client.setEx(sessionId, 1800, JSON.stringify(sessionData));
// 세션 가져오기
const storedSession = await client.get(sessionId);
if (storedSession) {
console.log("세션 불러오기:", JSON.parse(storedSession));
} else {
console.log("세션이 만료되었거나 존재하지 않습니다.");
}
// TTL 연장 (원하는 시점에서)
await client.expire(sessionId, 1800);
await client.disconnect();
})();
실시간 랭킹(Ranking) 관리
-
실시간 게임 순위 관리: 유저 Score를 관리하며, 점수 업데이트 시 자동 정렬된다. 이를 통해 실시간 랭킹 조회가 가능하다.
const { createClient } = require('redis');
(async () => {
const client = createClient();
await client.connect();
const leaderboardKey = "game_leaderboard";
const players = [
{ id: "gg1", score: 100 },
{ id: "gg2", score: 200 },
{ id: "gg3", score: 150 },
];
// 점수 업데이트
for (const { id, score } of players) {
await client.zAdd(leaderboardKey, [{ score, value: id }]);
}
// 랭킹 상위 3명 조회 (점수 높은 순)
const topPlayers = await client.zRangeWithScores(leaderboardKey, 0, 2, { REV: true });
topPlayers.forEach((player, index) => {
console.log(`${index + 1}위: ${player.value} (점수: ${player.score})`);
});
await client.disconnect();
})();