본문 바로가기

개발

node js 캐싱 성능최적화 (Redis, Memcached)

Node.js는 대규모 웹 애플리케이션을 만들기에 적합하다고 알려져있습니다. 그러나 많은 사용자가 동시에 액세스하는 경우 성능 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위해 캐싱과 성능 최적화는 중요한 역할을 합니다.

캐싱은 이전에 계산된 값을 저장하여 재사용하는 메커니즘입니다. 캐시는 웹 애플리케이션의 응답 속도를 향상시키고 서버 부하를 줄이는 데 도움이 됩니다. Node.js에서는 Redis와 Memcached와 같은 인기 있는 캐싱 시스템을 사용하여 이점을 얻을 수 있습니다.

 

Redis

Redis는 인메모리 데이터 구조 저장소로서 캐싱, 세션 관리, 메시지 브로커 등 다양한 용도로 사용됩니다. Redis는 데이터를 디스크에 저장하는 대신 메모리에 저장하므로 빠른 응답 시간을 제공합니다. Node.js에서 Redis를 사용하려면 Redis 클라이언트를 설치하고 연결을 설정해야 합니다. Redis 모듈을 사용하면 Node.js에서 Redis와 통신할 수 있습니다. Redis를 사용하여 데이터를 캐시하면 매번 데이터베이스에 액세스하지 않아도 되므로 응답 시간이 크게 개선됩니다.

다음은 Node.js에서 Redis를 사용한 캐싱 예시 코드입니다.

const redis = require("redis");
const client = redis.createClient();

// 데이터 조회 함수
function getDataFromCache(key) {
  return new Promise((resolve, reject) => {
    client.get(key, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

// 데이터 저장 함수
function setDataInCache(key, data) {
  client.set(key, data);
}

// 예시 사용
async function fetchDataFromAPI(userId) {
  const cacheKey = `user:${userId}`;
  const cachedData = await getDataFromCache(cacheKey);

  if (cachedData) {
    // 캐시에서 데이터 가져옴
    return JSON.parse(cachedData);
  } else {
    // 데이터베이스에서 데이터 가져옴
    const data = await fetchDataFromDatabase(userId);
    // 데이터를 캐시에 저장
    setDataInCache(cacheKey, JSON.stringify(data));
    return data;
  }
}

Memcached

Memcached는 분산 메모리 객체 캐시 시스템으로서 주로 웹 응용 프로그램에서 사용됩니다. Memcached는 간단하고 빠르며 확장성이 뛰어나며, 데이터를 키-값 쌍으로 저장합니다. Node.js에서 Memcached를 사용하려면 Memcached 클라이언트를 설치하고 연결을 설정해야 합니다. Memcached 클라이언트를 통해 Node.js에서 Memcached 서버와 상호 작용할 수 있습니다. Memcached를 사용하여 데이터를 캐시하면 데이터베이스 또는 다른 비용이 많이 드는 작업에 대한 액세스를 줄일 수 있으므로 성능이 향상됩니다.

 

다음은 Node.js에서 Memcached를 사용한 캐싱 예시 코드입니다.

const Memcached = require("memcached");
const memcached = new Memcached("localhost:11211");

// 데이터 조회 함수
function getDataFromCache(key) {
  return new Promise((resolve, reject) => {
    memcached.get(key, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

// 데이터 저장 함수
function setDataInCache(key, data, expiration) {
  memcached.set(key, data, expiration);
}

// 예시 사용
async function fetchDataFromAPI(userId) {
  const cacheKey = `user:${userId}`;
  const cachedData = await getDataFromCache(cacheKey);

  if (cachedData) {
    // 캐시에서 데이터 가져옴
    return JSON.parse(cachedData);
  } else {
    // 데이터베이스에서 데이터 가져옴
    const data = await fetchDataFromDatabase(userId);
    // 데이터를 캐시에 저장, 만료 시간은 1시간으로 설정
    setDataInCache(cacheKey, JSON.stringify(data), 3600);
    return data;
  }
}

Node.js에서 Redis와 Memcached를 사용하여 캐싱을 구현할 때 몇 가지 고려해야 할 사항이 있습니다.

첫째, 어떤 데이터를 캐시할 것인지 결정해야 합니다. 빈번하게 변경되는 데이터를 캐시하면 캐시된 데이터가 실제 데이터와 일치하지 않을 수 있습니다.

두 번째, 데이터의 만료 시간을 설정해야 합니다. 만료 시간이 지난 데이터는 자동으로 캐시에서 삭제됩니다.

세 번째, 메모리 사용을 최적화하기 위해 적절한 캐시 크기를 설정해야 합니다. 캐시가 너무 작으면 유용한 데이터가 삭제될 수 있고, 캐시가 너무 크면 메모리 부족 문제가 발생할 수 있습니다.

 

캐싱과 성능 최적화는 Node.js 애플리케이션의 성능을 향상시키는 데 중요한 역할을 합니다. Redis와 Memcached와 같은 캐싱 시스템을 사용하면 응답 시간을 줄이고 서버 부하를 줄일 수 있습니다. 그러나 올바른 캐시 전략을 수립하고 적절한 설정을 해야만 최상의 결과를 얻을 수 있습니다. Node.js에서 캐싱과 성능 최적화를 올바르게 구현하면 확장성과 사용자 경험을 향상시킬 수 있습니다.