본문 바로가기

Redis

[Redis] Redis란? 개념부터 활용까지

1. Redis 란?

Redis (Remote Dicionary Server)는 메모리(RAM)를 주 저장 공간으로 사용하는 초고속 Key-Value 기반의 인 메모리 데이터 저장소이며, 문자열 뿐아니라 Hash, List, ZSet, Stream 같은 자료구조를 제공한다.

1-1. 그렇다면, Redis vs RDB (MySQL)

  • Redis
    • Key / Value ( String, Hash, List, Stream )
    • 조인 x, 단건 /간단 연산에 빠름
    • 메모리 기반 → 엄청 빠름 (지연시간 ↓)
    • 기본이 메모리라 장애 시 유실 가능성이 있지만, RDB/AOF로 조절 가능하긴 하다.
    • 단일 명령은 원자적, 복합 로직은 Lua 스크립트로 원자 처리하거나 분산락으로 제어

 

  • RDB
    • 테이블 (행/열) + 관계(FK) 기반
    • 조인/집계 같은 복잡한 질의에 강함
    • 디스크 기반 → 상대적으로 느리지만 범용적
    • 기본이 영구 저장 + 트랜잭션 (ACID) 강력 + 백업/복구 유리
    • 트랜잭션 + 락 + 격리수준으로 정합성 보장

 

  • 활용 용도
    • RDB : 정확하고 영구적으로 쌓는 메인 데이터베이스
    • Redis : 빠른 처리 (캐시,세션,락,큐)에 특화된 인메모리 데이터 저장소

 


2. Redis 활용 용도 (캐시, 세션, 락, 큐)

2-1. 캐시(Cache)

캐시란?
자주 조회되는 데이터를 Redis에 잠깐 저장해두고, 다음 요청부터는 DB나 외부 API를 다시 안 타게 만드는 방식이다.

  • Redis 로 캐시를 활용하는 이유
    • Redis는 메모리 기반이라 응답 속도가 빠르고, DB 부하를 줄이는데 효과적이다.

    • 특히 트래픽이 몰리는 서비스에서 “조회 성능 개선 + DB 보호” 용도로 많이 사용된다.

 

  • 캐시 적용 시 고려할 3가지
    • TTL (만료 시간)
      : 캐시는 원본 데이터와 달라질 수 있으므로, 일정 시간이 지나면 자동으로 삭제 되도록 만료시간 설정을 해야한다.

    • 캐시 무효화 (Cache Invalidation)
      : 원본 데이터가 변경되면 캐시도 함께 삭제하거나 갱신해야 오래된 데이터 문제를 줄일 수 있다.

    • 캐시 스탬피드(Cache Stampede)
      : 캐시가 동시에 만료되거나 미스가 발생하면 요청이 한꺼번에 DB로 몰려 폭주할 수 있다.
      이를 방지하기 위해 락을 걸거나, singleFlight(동일 요청 1개만 원본 조회) 같은 방식으로 제어 한다.

 

2-2. 세션(Session Store)

세션이란?
사용자의 로그인 상태나 사용자별 상태(장바구니, 인증 상태 등)을 Redis에 저장해두고 서버들이 공통으로 읽도록 하는 방식이다.

  • Redis로 세션을 활용하는 이유
    • 서버가 여러 대일 때 (로드밸런싱)도 로그인/상태를 유지하기 좋다.
      → 로드밸런싱이란? 여러 대의 서버에 들어오는 요청(트래픽)을 골고루 나눠주는 것

    • 세션 데이터를 애플리케이션 서버 메모리에 두지 않아도 되어 확장성(Scale-out)이 좋아진다.

    • 메모리 기반이라 세션 조회가 빠르다.

 

  • 세션 적용 시 고려할 3가지
    • TTL (세션 만료)
      : 세션은 영구 데이터가 아니라 만료가 필요하다. Redis에 TTL을 두고 자동 만료되게 설계한다.

    • 보안(세션 하이재킹 방지)
      : 쿠키 설정 (HttpOnly, Secure(Https), SameSite) 같은 옵션을 적절히 적용한다.

    • 세션 정리/무효화 전략
      : 로그아웃, 비밀번호 변경, 권한 변경 시 기존 세션을 강제만료 시키는 전략이 필요하다.

 

2-3. 락(Lock)

락이란?
동시에 여러 요청이 같은 자원을 수정하려 할 때, 한 번에 하나만 처리되도록 막는 동시성 제어 방식이다.

  • Redis로 락을 활용하는 이유
    • Redis는 단일 명령이 원자적으로 처리되어 락 구현에 유리하다.

    • DB 락에 의존하지 않고도 분산환경에서 공통 락을 잡을 수 있다.

    • 예약/결제/선착순 같은 동시 요청 충돌을 막는 데 효과적이다.

 

  • 락 적용 시 고려할 3가지
    • TTL (락 만료시간)
      : 락을 잡은 서버가 죽으면 영원히 잠길 수 있으니, 반드시 TTL을 둬서 자동 해제되게 한다.

    • 락 해제 안정성
      : 락을 풀 때는 “내가 잡은 락인지”를 검증하고 해제해야 한다. 보통 락 value에 랜덤 토큰을 넣고, Lua 스크립트로 검증+삭제를 원자적으로 처리한다.

    • 재시도/대기 전략
      : 락 획득 실패 시 바로 실패할지, 일정 시간 재시도할지, 대기(백오프)를 둘지 정책이 필요하다.
      대기 시간이 길면 UX 가 나빠질 수 있어 “빠른 실패+안내”도 흔한 선택이다.

 

2-4. 큐(Queue) / 이벤트

큐란?
처리해야 할 작업을 바로 실행하지 않고 “대기열”에 넣고, 워커가 순서대로 처리하는 방식이다. 이벤트는 “무언가 발생했다”는 사실을 전달하는 메시지이다.

  • Redis로 큐를 활용하는 이유
    • 느린 작업(알림 발송, 로그 저장, 이미지 처리)을 요청 흐름에서 분리하면 응답이 빨라진다.

    • 트래픽이 몰려도 큐가 완충 역할을 해 시스템이 안정적이다.

    • Redis 자료구조 (List, Stream)로 간단히 구현할 수 있다.

 

  • 큐 적용 시 고려할 3가지
    • 유실/재처리 요구 수준
      : Pub/Sub 는 빠르지만 구독자가 잠깐 죽으면 메시지가 유실 위험이 있다.
      유실이 치명적이면 Streams(컨슈머 그룹) 또는 별도 메시지 브로커 (RabbitMQ, Kafka)를 고려해야 한다.

    • 중복 처리 (Idempotency)
      : 큐 기반 시스템은 재시도 과정에서 같은 메시지가 중복 처리될 수 있다.
      따라서 “중복이어도 결과가 안전한” 멱등성을 설계해야한다.
      → 멱등성이란? 같은 요청을 여러번 보내도 결과가 한 번 보낸것과 똑같이 유지되는 성질

    • 처리량/지연 모니터링
      : 큐 길이, 처리 속도, 실패율, 재시도 횟수를 관찰해야 한다.
      적체가 심하면 컨슈머 스케일 아웃, 작업 분리, 우선순위 큐 같이 개선이 필요하다.

GitHub