Header Banner
GG Logo

Future Engineering

기술의 최전선을 기록합니다.

기술 자료/Redis/Redis의 대표적인 활용 사례

Redis의 대표적인 활용 사례

Redis8개월 전

캐싱 (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();
})();