[Redis] API 응답 속도가 2초? (feat. Redis)

Zain·2025년 1월 1일
post-thumbnail

미션 리스트를 가져오는 API의 응답 속도는 약 2000ms 정도 소요됐다.
느린 이유는 복잡한 사용자 입력 정보를 기반으로 curl을 통해 참여 가능한 미션 정보를 반환받았기 때문이다.

클라이언트에서 값을 유지하려면 store를 사용할 것 같았지만,
최대한 store 사용을 지양하고 Redis를 활용해 속도를 개선하고자 했다.


1. Redis란?

Redis는 인메모리 데이터 구조 저장소로, 데이터를 메모리에 저장하여 빠르게 읽고 쓸 수 있는 시스템임.

  • 주요 특징
    • 인메모리: 데이터를 디스크가 아닌 메모리에 저장하여 초고속 데이터 처리 가능.
    • 다양한 데이터 구조: 문자열, 리스트, 셋, 해시, 정렬된 셋 등 다양한 데이터 구조를 지원.
    • 빠른 성능: 초당 수백만 개의 명령을 처리할 수 있을 만큼 빠름.

2. Redis가 빠른 이유

Redis는 인메모리 데이터베이스로 디스크 I/O를 사용하지 않고 메모리에서 바로 데이터를 처리함. 이를 통해 읽기/쓰기 속도가 매우 빠름.


3. RDB와 Redis의 차이점

RDBRedis는 데이터 저장 방식에서 큰 차이가 있음. 두 시스템 모두 데이터를 저장하지만, 접근 속도, 사용 용도, 동작 방식에서 차이가 있음.

  • RDB (Relational Database)

    • RDB는 관계형 데이터베이스로 데이터를 디스크에 저장함.
    • 데이터 모델링이 복잡하고, 쿼리를 사용해 데이터를 조회함.
    • 디스크 기반이기 때문에, 데이터가 많아지면 성능이 저하될 수 있음.
  • Redis

    • Redis는 인메모리 데이터베이스로 데이터를 메모리에 저장함.
    • 복잡한 쿼리 없이 데이터를 빠르게 조회하고 처리할 수 있음.
    • 디스크 I/O 없이 데이터를 빠르게 처리할 수 있기 때문에, 성능이 뛰어남.
    • 그러나 메모리 용량에 제한이 있어 대용량 데이터를 저장하기에는 부적합할 수 있음.

주요 차이점

  • 속도: Redis는 메모리에서 데이터를 처리하므로 빠르고, RDB는 디스크에서 데이터를 처리하므로 상대적으로 느림.
  • 사용 목적: Redis는 주로 캐시, 세션 저장소, 실시간 데이터 처리 등에 사용되며, RDB는 주로 관계형 데이터 저장 및 복잡한 쿼리에 사용됨.
  • 영속성: RDB는 데이터를 디스크에 저장하므로 영속성이 보장되지만, Redis는 기본적으로 인메모리 시스템이라서 데이터를 영속적으로 저장하려면 추가적인 설정이 필요함.

4. Redis 사용 시 유의할 점

Redis는 매우 빠르고 효율적인 데이터베이스이지만, 사용 시 몇 가지 유의할 점들이 있음. 잘못 설정하거나 과도하게 사용하면 성능 저하나 데이터 손실이 발생할 수 있음.

1. 메모리 관리

Redis는 인메모리 시스템이라서 메모리 사용량이 중요함. 데이터가 많아지면 메모리가 부족할 수 있음. Redis의 메모리 용량을 관리하기 위해서는 주기적인 데이터 삭제나 만료 설정이 필요함.

  • TTL 설정: 캐시된 데이터에 TTL(Time to Live)을 설정하여 자동으로 만료되게 할 수 있음.
  • LRU(Least Recently Used) 제거: 메모리가 부족하면 가장 오래된 데이터를 제거하는 방식으로 메모리 관리가 가능함.

2. 데이터 영속성

Redis는 기본적으로 인메모리 방식으로 동작하므로, 서버가 종료되면 데이터가 사라짐. 이를 방지하려면 영속성 설정이 필요함.

  • RDB: 주기적으로 데이터를 디스크에 스냅샷으로 저장함.
  • AOF (Append Only File): 모든 쓰기 작업을 로그로 저장하여 데이터 손실을 최소화함.

영속성을 사용할 경우 성능이 다소 저하될 수 있으므로, 성능과 데이터 안전성의 균형을 고려해야 함.

3. 데이터 일관성 관리

Redis는 주로 캐시 시스템으로 사용되기 때문에, 캐시된 데이터와 DB의 데이터 일관성 관리가 필요함.

  • 캐시 무효화: DB 업데이트 시 Redis 캐시를 무효화하거나 새로 갱신하는 작업이 필요함.
  • 캐시 일관성: DB와 캐시의 데이터가 일치하도록 주기적인 검증이나 이벤트 기반 갱신이 필요함.

Redis 사용시 주의

서비스 함수에서 데이터를 처리할 때, Redis 사용은 무조건 Redis에서만 데이터를 가져오는 것이 아니라, 캐시된 데이터를 검증하고 필요시 업데이트하는 과정이 필요함. 이 과정은 캐시 일관성을 유지하고, 데이터의 정확성을 보장하는 데 중요함.

1. Redis에서 가져옴 -> 검증 -> 리턴

Redis에서 데이터를 가져오고, 그 데이터를 검증한 후 유효하면 바로 리턴하는 방식임. 캐시된 데이터가 유효할 때 빠르게 데이터를 반환할 수 있음.

// Redis에서 데이터를 가져오고, 유효하면 바로 리턴
$data = Redis::get($key);

// 데이터가 유효한지 검증
if (isValid($data)) {
    return $data;
}
  1. Redis에서 가져옴 -> 검증 -> 실패 -> Redis 업데이트 -> 리턴
    Redis에서 데이터를 가져오고, 검증한 후 데이터가 유효하지 않거나 없으면 DB에서 데이터를 가져와 Redis를 업데이트하는 방식임. 업데이트된 데이터를 리턴하게 됨.
// Redis에서 데이터를 가져옴
$data = Redis::get($key);

// 데이터가 없거나 유효하지 않으면 DB에서 가져와서 Redis 업데이트
if (!$data || !isValid($data)) {
    // DB에서 데이터를 가져옴
    $data = fetchDataFromDatabase($key);

    // Redis에 데이터를 업데이트
    Redis::set($key, $data);
}

return $data;

요약

  • 캐시 미스(Cache Miss): Redis에서 데이터가 없거나 만료된 경우, DB에서 데이터를 가져오고 캐시를 업데이트한 후 리턴하는 방식임.
  • 캐시 업데이트(Cache Update): DB에서 데이터를 가져와 Redis에 업데이트하여 이후 요청 시 빠른 응답을 받을 수 있도록 함.
  • 캐시 검증(Cache Validation): Redis에서 가져온 데이터가 유효한지 확인하고, 유효하지 않으면 DB에서 데이터를 가져와 Redis에 업데이트 후 리턴하는 방식임.
profile
Vue, Laravel | TS, JS, PHP, MySQL

0개의 댓글