하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.
1. 레디스 아키텍처
- 원본 데이터는 RDBMS에 저장하고, Redis는 그 앞단에 캐시로 배치
읽기 관점
항목 | Lazy-loading 패턴 (Cache-aside) | Read-Through 패턴 |
Redis에 데이터 없을 때 | 애플리케이션이 DB에서 읽고 Redis에 저장 |
라이브러리가 DB에서 읽고 Redis에 저장
|
장점 | 자주 쓰는 데이터만 캐시에 저장됨 |
애플리케이션 코드가 단순해짐
|
단점 | 첫 요청이 느림 캐시 로딩 로직을 직접 구현해야 함 |
특정 클라이언트/미들웨어에 의존하게 됨
|
적용 예시 | Spring + Redis 조합 (직접 로직 작성) |
RedisTemplate + Spring Cache 추상화
|
쓰기 관점
항목 | Write-Through 패턴 | Write-Back 패턴 |
Write-Around 패턴
|
쓰기 순서 | RDBMS와 Redis에 동시 저장 | Redis에 먼저 저장 이후 DB에 비동기 반영 |
DB에만 저장
이후 Redis에 복제 |
장점 | Redis와 DB 간 즉시 동기화 | 빠른 응답 DB 부하 감소 최종 데이터 반영 |
불필요한 캐시 저장 방지
최신 데이터 유지 |
단점 | 쓰기 성능 저하 (이중 저장) | 일관성 문제 데이터 유실 위험 |
읽기 성능 저하 (캐시 미스 많음) |
적합한 상황 | 정합성이 중요한 경우 | 쓰기 빈번 + 유실 허용 |
읽기 위주 애플리케이션
|
예시 | 상품 주문 처리 시스템 | 실시간 클릭 로그 인기 콘텐츠 추천 시스템 |
정적 상품 정보 캐시, 뉴스 콘텐츠 캐시 등
|
아키텍처 안티 패턴
- 레디스 서버의 다운으로 애플리케이션이 동작하지 않는 경우
- 장애 대비 fallback 로직 필수
데이터 저장소로서의 레디스 아키텍처
- 관계계형 데이터베이스에서 구현하기 어려운 경우
- 작은 데이터의 빈번한 쓰기 작업이 필요한 경우
주의 사항
- 복구 방법 확인
- 관계형 데이터베이스와 함께 사용할 경우, 롤백 발생 시 데이터 일관성 측면에서 애플리케이션 구현에 문제가 없는지 확인
- 레디스의 레플리케이션 기능이나 스냅숏 생성을 사전에 준비하기
2. 모범 사례
TTL 설정
- 오래된 데이터를 자동으로 제거하는 기능
- 메모리 낭비 방지
- Redis는 기본적으로 데이터 소실이 허용되는 데이터를 저장하므로 장기 저장이 불필요함
- 최소 보관 시간을 TTL로 설정하여 불필요한 메모리 낭비를 방지할 수 있음
제거 정책 설정
- 메모리 사용량이 maxmemory에 도달하면 maxmemory-policy에 따라 키 제거함
예시
더보기
# 모든 키 대상
maxmemory-policy allkeys-lru # 오래된 데이터 자동 정리
maxmemory-policy allkeys-lfu # 가장 적게 사용된 데이터 자동 정리
maxmemory-policy allkeys-random # 아무 데이터나 자동 정리 (공간이 부족할 때, 무작위로 삭제해도 상관없는 경우)
# TTL이 설정된 키 대상
maxmemory-policy volatile-ttl # 가장 만료 시간이 가까운 데이터 삭제
대상
- volatile-: TTL이 설정된 키 대상
- allkeys-: 모든 키 대상
전략
- LRU, LFU, 랜덤, TTL 기반 정책 선택 가능
백업
스냅숏 생성 시 고려사항
- COW 로 인해 두 배의 메모리 필요
- 서비스 영향이 적은 시간대에 실행하여 서비스를 원활히 운영하기
- 마스터가 아닌 레플리카에서 수행 (단, 비동기 동기화로 인해 일관성이 깨질 가능성 있음)
- 지연 발생 시 완전 동기화가 필요할 수 있으며, 이때 마스터 노드에도 메모리 용량이 필요하므로 여유가 있는지 필수로 확인하기
커넥션 풀링
- 새로운 연결 생성 시, 비용과 오버헤드가 증가하므로 커넥션 풀링으로 해결함
- maxclients 지시자로 셋팅 가능 (최대 개수는 커널 소프트 제한 영향을 받음)
재시도 처리
- 통신 장애 시, 클라이언트에서 재시도 수행
- 재시도 고려 요소, 횟수, 타임아웃, 간격, 상한선
- 지수 백오프 알고리즘: 실패 시 대기시간을 두배로 증가시키고 재시도하기
- 지터 적용: 클라이언트의 동시 재시도를 방지함. (과부하를 예방함)
'Database > Redis' 카테고리의 다른 글
[실전 레디스] 5-4. 레디스 운용 관리: 관리 (0) | 2025.03.21 |
---|---|
[실전 레디스] 5-3. 레디스 운용 관리: 셋팅 (0) | 2025.03.21 |
[실전 레디스] 5-1. 레디스 운용 관리: 영속성 (0) | 2025.03.21 |
[실전 레디스] 3-1. 고급 기능: 주요 기능 (0) | 2025.03.21 |
[실전 레디스] 3-2. 고급 기능: 루아 (0) | 2025.03.21 |