Redis

Xylitol311·2026년 1월 13일

Back-end

목록 보기
6/14

Redis란?

Remote Dictionary Server의 약자로, 키-값 구조의 인메모리 데이터 저장소다. 데이터를 메모리에 저장하여 빠른 읽기/쓰기를 제공하며, 선택적으로 디스크에 영속화할 수 있다.

핵심 특징

  • In-Memory 기반: 모든 데이터를 RAM에 저장하여 매우 빠른 응답 속도 (평균 1ms 이하)
  • Single-Thread 모델: 하나의 요청을 처리하는 동안 다른 요청은 대기 (명령어의 원자성 보장)
  • 다양한 자료구조 지원: String, List, Set, Sorted Set, Hash, Bitmap, HyperLogLog 등
  • 영속성 옵션: RDB 스냅샷, AOF 로그를 통한 데이터 복구 가능
  • Pub/Sub 기능: 메시지 브로커 역할 수행

Redis가 빠른 이유

1. 메모리 접근 속도

  • RAM 접근 시간: 약 100ns
  • SSD 접근 시간: 약 100μs (1,000배 느림)
  • HDD 접근 시간: 약 10ms (100,000배 느림)
  • 디스크 I/O, 파일 시스템 오버헤드가 완전히 제거됨

2. Single-Thread 아키텍처의 장점

  • Lock 불필요: 동시성 제어를 위한 Lock/Unlock 오버헤드 없음
  • Context Switching 제거: CPU 코어 간 스레드 전환 비용 없음
  • 명령어 원자성 보장: 하나의 명령은 완전히 처리되거나 처리되지 않음
  • 예측 가능한 성능: Multi-thread의 경쟁 상태나 데드락 걱정 없음

3. I/O Multiplexing

Single-Thread지만 여러 클라이언트 동시 처리 가능

  • Linux의 epoll, BSD의 kqueue 같은 이벤트 기반 I/O 사용
  • 수천 개의 연결을 하나의 스레드로 효율적으로 처리
  • 네트워크 I/O는 비동기로 처리, 실제 데이터 처리만 순차적

4. 단순한 데이터 모델

  • Key-Value 직접 접근으로 O(1) 시간 복잡도
  • SQL 파싱, 쿼리 최적화, 트랜잭션 오버헤드 없음
  • 관계형 DB의 JOIN, 인덱스 탐색 과정 불필요

5. 최적화된 자료구조

  • C 언어로 구현된 고성능 자료구조
  • Sorted Set: Skip List 사용으로 O(logN) 성능
  • Hash: 충돌 최소화된 해시 테이블
  • 메모리 단편화 최소화를 위한 jemalloc 사용

주요 활용 사례

1. 캐싱 (가장 일반적)

DB 조회 결과를 임시 저장하여 응답 속도 개선 및 DB 부하 감소

Spring Boot 예시:

@Cacheable(value = "users", key = "#id")
public User findById(Long id) {
    return userRepository.findById(id);
}

2. 세션 저장소

분산 환경에서 사용자 세션을 공유

  • WAS가 여러 대일 때 세션 일관성 유지
  • Sticky Session 불필요
  • Spring Session + Redis 조합으로 간단히 구현

3. 분산 락 (Distributed Lock)

여러 서버에서 동시에 접근하는 자원을 제어

// Redisson 예시
RLock lock = redissonClient.getLock("order:lock:" + orderId);
if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
    try {
        // 주문 처리 로직
    } finally {
        lock.unlock();
    }
}

4. 실시간 랭킹/리더보드

Sorted Set을 이용한 점수 기반 순위 관리

5. Rate Limiting

API 요청 제한, IP별 접근 제어

데이터 영속성 전략

  • RDB: 특정 시점의 스냅샷, 복구 속도 빠름, 일부 데이터 손실 가능
  • AOF: 모든 쓰기 연산 로그, 데이터 손실 최소화, 파일 크기 큼

주의사항

1. 메모리 관리

  • 메모리가 가득 차면 maxmemory-policy 정책에 따라 데이터 삭제
  • 주요 정책: allkeys-lru, volatile-lru, noeviction
  • 적절한 TTL 설정 필수

2. Single-Thread 특성

  • 오래 걸리는 명령어(KEYS, FLUSHALL) 사용 금지
  • 대신 SCAN 명령어 사용
  • 대량의 데이터는 Pipeline으로 처리

3. 캐시 전략

  • Cache-Aside: 애플리케이션이 캐시 관리 (Spring 기본)
  • Write-Through: 쓰기 시 캐시도 함께 업데이트
  • Write-Behind: 비동기로 DB에 반영

4. 데이터 일관성

  • Cache Stampede: 캐시 만료 시 동시 DB 접근 방지 (Lock 사용)
  • 캐시 워밍: 서비스 시작 시 주요 데이터 미리 적재

핵심 요약

  • Redis는 인메모리 기반으로 초고속 읽기/쓰기 제공
  • Single-Thread + I/O Multiplexing으로 높은 동시성 처리
  • 캐싱, 세션, 분산 락 등 다양한 용도로 활용
  • Single-Thread 특성상 무거운 연산 금지
  • 적절한 TTL과 메모리 관리 필수
profile
문제에 도전하고 성장하는 백엔드 개발자입니다.

0개의 댓글