Redis: 인메모리 데이터 저장소 그리고 간단한 캐시 활용 예시와 실무 시나리오

이상민·2024년 10월 14일
0

CPU, Memory, Disk 역할 정리

  • CPU: 컴퓨터의 두뇌로 모든 연산을 처리한다.

  • Memory: 임시 저장 장치로 CPU가 빠르게 접근해야 할 데이터를 저장한다. 계산이 끝난 후 데이터를 지운다.

  • Disk: 영구 저장 장치로, 데이터를 오래 보관하는 역할을 한다.

처리 속도 차이!!

메모리와 디스크 간 I/O 성능은 수십에서 수천 배 차이가 난다.

Memory >>> Disk

캐시의 특징

  • 빠르다: Disk에 비해 읽기/쓰기 속도가 매우 빠르다.

  • 휘발성: Disk와 달리 영구적으로 데이터가 저장되지 않는다.

대표적인 캐시 시스템으로 Redis가 있다.

Redis 개요

Redis는 메모리 기반의 데이터 저장소로 휘발성을 갖는다. 주로 데이터 접근 속도가 중요한 곳에서 활용된다.

Redis의 주요 특징

  • 인메모리 저장소: 메모리에 데이터를 저장해 매우 빠른 성능을 제공한다.

  • 다양한 데이터 구조 지원: 문자열, 리스트, 해시, 집합, 정렬된 집합 등을 지원한다.

  • 데이터 지속성 옵션: 데이터를 디스크에 저장해 영구 보관이 가능하다.

  • 분산 시스템 지원: 클러스터와 복제로 확장성과 가용성을 높인다.

  • Pub/Sub 및 Lua 스크립팅 지원: 실시간 메시지 큐와 서버 측 스크립트를 제공해 다양한 서비스에 활용된다.

Redis가 지원하는 데이터 구조

1. String

  • 키-값 구조로 저장하며, 키로 값을 검색한다.
  • 예: 사용자 세션 정보 저장.

2. Lists

  • 순서가 있는 데이터의 목록을 저장한다.
  • 예: 채팅 메시지 기록 저장.

3. Sets

  • 중복을 허용하지 않는 집합 구조다.
  • 예: 이벤트 참가자 목록 관리.

4. Sorted Sets

  • 중복 없이 정렬된 집합으로 가중치를 통해 우선순위를 지정할 수 있다.

  • 예: 랭킹 시스템 구현.

5. Hashes

  • 필드와 값의 쌍으로 이루어진 테이블 형태다.
  • 예: 유저 프로필 정보 저장.

6. Geospatial

  • 위도와 경도로 위치 정보를 관리한다.
  • 예: 광화문에서 인천공항까지의 거리 계산.

Redis의 다양한 데이터 구조를 활용하면 비즈니스 로직을 단순화하고 유지보수를 용이하게 할 수 있다.

Redis의 단점과 극복 방안

Redis는 메모리 기반이라 휘발성 문제를 가진다.
장애가 발생하면 데이터가 손실될 수 있다.
이를 해결하는 몇 가지 전략이 있다.

1. RDB: 주기적인 스냅샷 저장

  • Redis의 데이터를 주기적으로 디스크에 저장해 장애 발생 시 복구할 수 있다.

장점

  • 설정이 간단하며 관리가 쉽다.
  • 주기적으로 디스크에 저장해 복구가 가능하다.

단점

  • 스냅샷과 스냅샷 사이의 데이터 손실 가능성.
  • 데이터가 많을 경우 스냅샷 시 시스템 리소스 사용 증가.

2. AOF: 명령 로그 기록

Redis의 모든 명령을 로그로 기록해 복구 시 재실행한다.

장점

  • 데이터 손실 가능성을 최소화한다.
  • 장애 발생 시 최신 데이터를 복구할 수 있다.

단점

  • AOF 파일이 커질 수 있으며 복구 시간이 길어질 수 있다.
  • 주기적인 파일 압축이 필요하다.

3. Redis 복제 (Master-Slave 구조)

  • 여러 Redis 인스턴스를 사용해 한 개의 Redis가 장애가 나더라도 데이터를 보존한다.

구조

  • Master Redis가 요청을 처리하고, Slave Redis에 데이터를 복제한다.

  • Master 장애 시 Slave가 Master로 승격되고, 복구된 Master는 다시 Slave로 전환된다.

Redis Sentinel

Redis에 문제가 발생할 경우 장애를 자동으로 처리하기 위해 Redis Sentinel을 사용한다.

Sentinel의 역할

  • 여러 Redis 인스턴스를 모니터링하고, 장애 발생 시 Failover를 수행한다.

  • Master에 장애가 발생한 경우 다른 Sentinel들이 Master의 상태를 확인한다.

Sentinel 시스템 예시

  • 경기도에 있는 A 서버, 제주도에 있는 B 서버, 미국 워싱턴에 있는 C 서버에 각각 Redis를 배포해 관리한다.

  • 개발자는 하나의 Redis처럼 사용하며, 데이터가 수정되면 나머지 인스턴스에도 자동으로 반영된다.

Redis Cluster

Redis Cluster는 여러 Sentinel과 유사한 구조로, 데이터 분산과 고가용성을 제공한다.

Redis 캐시 활용 예시와 실무 시나리오

1. 로그인 세션 관리

  • 예시:
    사용자가 로그인하면 서버는 Redis에 세션 정보를 저장하고, 유효기간(예: 30분)이 지나면 자동으로 삭제된다.
    만약 사용자가 여러 번 로그인하면 Redis의 String 구조를 사용해 가장 최근 세션만 유지할 수 있다.
  • 적용 효과:
    데이터베이스 대신 Redis를 사용하면 인증 처리 속도가 빨라지고 서버 부하가 줄어든다.

2. 장바구니 데이터 관리

  • 예시:
    사용자가 쇼핑몰에서 상품을 장바구니에 담으면 Redis의 Hash 구조를 사용해 userId를 키로, 상품 정보를 값으로 저장한다.
  • 키: user:1234:cart
  • 값: { "item1": 2, "item2": 1 } (상품과 수량)
    사용자가 로그아웃하거나 일정 시간이 지나면 해당 장바구니 데이터가 삭제된다.
  • 적용 효과:
    장바구니 데이터를 메모리에서 관리하면 속도가 빨라져 사용자 경험이 향상된다.

3. 상품 랭킹 시스템

  • 예시:
    인기 상품 순위를 보여주기 위해 Redis의 Sorted Set 구조를 사용한다.
  • 키: top_selling_products
  • 값: 상품ID와 판매량 (score: 100, value: "product1")
    사용자가 상품을 구매할 때마다 판매량(score)을 업데이트하여 실시간으로 순위를 반영할 수 있다.
  • 적용 효과:
    실시간으로 순위를 집계하며, 사용자에게 정확한 인기 순위를 제공할 수 있다.

4. 실시간 채팅 시스템

  • 예시:
    채팅 애플리케이션에서 사용자는 Redis의 List 구조를 사용해 채팅 메시지를 저장하고 조회한다.
  • 채팅방 ID를 키로 사용: chatroom:1234
  • 메시지를 리스트에 추가: "안녕하세요", "이번 주말에 뭐해?"
  • Redis의 Pub/Sub 기능으로 실시간 메시지를 전송해 사용자 간 빠른 소통을 지원한다.
  • 적용 효과:
    채팅 시스템의 성능이 크게 향상되고, 지연 없이 메시지를 전달할 수 있다.

5. 트래픽 제한 (Rate Limiting)

  • 예시:
    API 호출 횟수를 제한하기 위해 Redis의 String을 사용해 IP 주소별 호출 횟수를 저장한다.
  • 키: rate_limit:192.168.0.1
  • 값: 호출 횟수
    호출 시마다 Redis에서 해당 IP의 값을 증가시키고, 일정 시간이 지나면 초기화한다.
  • 적용 효과:
    서버 부하를 방지하고 DDoS 공격을 막을 수 있다.

6. 재고 관리 시스템

  • 예시:
    이벤트 상품의 재고 수량을 Redis에 저장하고, 판매 시마다 Redis에서 재고를 감소시킨다.
  • 키: event_product:5678
  • 값: 재고 수량 50
    만약 재고가 0이 되면 더 이상 판매가 진행되지 않도록 한다.
  • 적용 효과:
    실시간 재고 관리를 통해 오버셀링을 방지하고, 이벤트 트래픽에 대한 응답성을 높인다.

7. 실시간 주문 처리

  • 예시:
    배달 애플리케이션에서 주문 접수와 동시에 Redis의 List에 주문을 저장한다.
  • 키: orders
  • 값: orderId: 101, 102, 103
    주문을 처리할 때마다 해당 주문을 리스트에서 제거한다.
  • 적용 효과:
    Redis를 사용하면 실시간으로 주문을 처리하고 빠르게 응답할 수 있다.

마무리

이런 다양한 실무 예시를 통해 Redis가 다양한 비즈니스 문제를 어떻게 해결하는지 찾아볼 수 있는 좋은 기회였다. Redis는 빠른 속도다양한 데이터 구조 덕분에 다양한 서비스에 유용하게 적용된다. 위와 같은 서비스를 구현할 때 나의 프로젝트에 한번 적용시켜 봐야겠다.

profile
안녕하세요

0개의 댓글