Back-End

[Redis] 기본 개념

Minch13r 2025. 5. 26. 17:00

1. Redis 기본 개념 및 아키텍처 🏗️

1.1 Redis란?

  • 정의: Redis(Remote Dictionary Server)는 오픈 소스 인메모리 데이터 구조 저장소
  • 개발자: Salvatore Sanfilippo(antirez)가 2009년 개발
  • 라이센스: BSD 라이센스
  • 구현 언어: ANSI C로 작성되어 이식성이 높음
  • 아키텍처: 이벤트 기반 단일 스레드 모델 사용

1.2 핵심 특징

  • 인메모리 처리: 모든 데이터를 RAM에 저장하여 초고속 처리 (초당 100,000+ 작업)
  • 다양한 데이터 구조: 단순 키-값 저장소를 넘어선 풍부한 데이터 타입 제공
  • 원자적 연산: 데이터 구조에 대한 원자적 작업 지원으로 경쟁 조건 방지
  • 내구성: RDB 스냅샷, AOF 로그 등을 통한 데이터 영속성 보장
  • 클러스터링: 수평적 확장성 지원
  • 확장 모듈: Redis 6.0부터 모듈 시스템으로 기능 확장 가능

2. Redis 데이터 타입 상세 분석 💾

2.1 Strings

  • 용도: 캐싱, 카운터, 비트 조작
  • 최대 크기: 512MB
  • 주요 명령어: SET, GET, INCR, DECR, APPEND, STRLEN
  • 예시 사용 패턴: 사용자 세션 토큰, 페이지 조회수

2.2 Lists

  • 구현: 연결 리스트(linked list)
  • 특징: 양쪽 끝에서의 삽입/삭제가 O(1)
  • 주요 명령어: LPUSH, RPUSH, LPOP, RPOP, LRANGE, LTRIM
  • 활용 사례: 최근 활동 로그, 메시지 큐, 소셜 미디어 타임라인

2.3 Sets

  • 특징: 중복 없는 문자열 컬렉션, 순서 없음
  • 주요 명령어: SADD, SREM, SISMEMBER, SMEMBERS, SUNION, SINTER, SDIFF
  • 성능: 멤버십 확인이 O(1)
  • 활용 사례: 태그 시스템, 고유 방문자 추적, 관계 모델링

2.4 Sorted Sets (ZSets)

  • 구조: 스코어(실수값)로 정렬된 고유 문자열 집합
  • 내부 구현: 스킵 리스트와 해시 테이블 조합
  • 주요 명령어: ZADD, ZRANGE, ZRANK, ZSCORE, ZREM, ZCOUNT
  • 성능: 범위 쿼리가 매우 효율적 O(log(N)+M)
  • 활용 사례: 리더보드, 우선순위 큐, 시간 기반 데이터 인덱싱

2.5 Hashes

  • 구조: 필드-값 쌍의 맵
  • 주요 명령어: HSET, HGET, HMSET, HMGET, HGETALL, HINCRBY
  • 메모리 효율: 작은 해시는 특별한 인코딩으로 메모리 절약
  • 활용 사례: 사용자 프로필, 객체 캐싱, 설정 저장

2.6 고급 데이터 타입

  • Streams: 추가 전용 로그 데이터 구조, 소비자 그룹 지원
  • Geospatial: 지리적 좌표 저장 및 반경 검색 (GEOADD, GEODIST, GEORADIUS)
  • HyperLogLog: 집합의 카디널리티 추정, 매우 낮은 메모리 사용 (PFADD, PFCOUNT)
  • Bitmaps: 문자열의 비트 단위 연산 (SETBIT, GETBIT, BITCOUNT)
  • Bitfields: 정수 배열을 비트 수준에서 압축 저장

3. Redis 명령어 및 프로토콜 📝

3.1 Redis 프로토콜 (RESP)

  • 특징: 간단하고 빠른 텍스트 기반 프로토콜
  • 구조: 라인 기반, 5가지 데이터 타입 지원
  • 구현 용이성: 파싱이 쉽고 구현이 간단함
  • RESP3: Redis 6.0부터 도입된 개선된 프로토콜

3.2 트랜잭션 처리

  • MULTI/EXEC: 명령 블록의 원자적 실행
  • WATCH: 낙관적 잠금 구현
  • 제한사항: 롤백 메커니즘 없음
  • 파이프라이닝: 네트워크 왕복 시간 최소화를 위한 명령 일괄 처리

3.3 Lua 스크립팅

  • EVAL/EVALSHA: 서버 측 스크립트 실행
  • 장점: 네트워크 지연 감소, 원자성 보장
  • 샌드박스: 제한된 환경에서 실행
  • 스크립트 캐싱: SHA1 해시로 재사용

4. Redis 영속성 메커니즘 💾

4.1 RDB (Redis Database)

  • 작동 방식: 지정된 간격으로 데이터셋의 포인트-인-타임 스냅샷 생성
  • 설정: SAVE 명령 또는 redis.conf의 SAVE 지시문
  • 장점: 작은 파일 크기, 빠른 재시작, 백업 용이
  • 단점: 장애 시 마지막 스냅샷 이후 데이터 손실 가능성

4.2 AOF (Append Only File)

  • 작동 방식: 모든 쓰기 작업을 로그 파일에 기록
  • 동기화 옵션: always, everysec, no
  • 장점: 내구성 향상, 인간 가독성, 자동 재작성
  • 단점: 파일 크기가 크고, RDB보다 느린 재시작

4.3 혼합 접근법

  • RDB+AOF: 두 방식의 장점 결합
  • 설정: aof-use-rdb-preamble yes
  • 작동 방식: AOF 재작성 시 RDB 헤더 사용

4.4 복구 프로세스

  • 시작 순서: AOF 존재 시 AOF 로드, 없으면 RDB 로드
  • 부분 복구: Redis 4.0부터 손상된 AOF의 부분 복구 지원

5. Redis 고가용성 및 확장성 🔄

5.1 복제 (Replication)

  • 구성: 마스터-레플리카 모델
  • 동기화 방식: 초기 전체 동기화 후 증분 동기화
  • 설정: replicaof 또는 REPLICAOF 명령
  • 특징: 비동기 복제, 읽기 확장성 제공

5.2 센티널 (Sentinel)

  • 목적: 고가용성 확보를 위한 자동 장애 감지 및 복구
  • 작동 방식: 마스터 노드 모니터링 및 장애 시 자동 장애 조치
  • 구성 요소: 여러 센티널 인스턴스가 쿼럼 기반 결정
  • 클라이언트 지원: 센티널-인식 클라이언트 라이브러리 필요

5.3 클러스터 (Cluster)

  • 목적: 수평적 확장 및 자동 샤딩
  • 아키텍처: 16384개의 해시 슬롯으로 데이터 분할
  • 노드 간 통신: 가십 프로토콜 사용
  • 장애 감지: 노드 간 하트비트 및 실패 감지
  • 제한사항: 다중 키 트랜잭션 제한, 슬롯 마이그레이션 시 성능 영향

6. Redis 메모리 관리 및 최적화 ⚡

6.1 메모리 정책

  • maxmemory: 최대 메모리 사용량 설정
  • 축출 정책: noeviction, allkeys-lru, volatile-lru, allkeys-random, volatile-random, volatile-ttl
  • LFU (Least Frequently Used): Redis 4.0부터 도입된 사용 빈도 기반 정책

6.2 메모리 최적화 기법

  • 특수 인코딩: 작은 리스트, 세트, 해시에 대한 압축 표현
  • 공유 객체: 정수 등 공통 값의 메모리 공유
  • 레이지 프리 (Lazy Free): 백그라운드에서 대규모 키 삭제
  • 활성 메모리 조각 모음: Redis 4.0부터 실시간 메모리 조각 모음 지원

6.3 성능 모니터링

  • INFO 명령: 메모리 사용량 및 통계 확인
  • MEMORY 명령: 상세 메모리 분석 (USAGE, STATS, DOCTOR)
  • SLOWLOG: 느린 명령 로깅 및 분석
  • Latency Monitoring: 지연 시간 모니터링 도구

7. Redis 보안 🔒

7.1 네트워크 보안

  • 바인딩: 특정 인터페이스로 제한
  • 보호 모드: 기본적으로 활성화
  • 방화벽: 접근 제한
  • TLS: Redis 6.0부터 네이티브 TLS 지원

7.2 인증 및 권한

  • AUTH: 비밀번호 기반 인증
  • ACL (Access Control Lists): Redis 6.0부터 도입
    • 사용자별 명령 및 키 패턴 접근 제어
    • 명령 카테고리 기반 권한 설정
    • 읽기 전용/쓰기 전용 계정 생성

7.3 데이터 보안

  • RENAME-COMMAND: 위험한 명령어 비활성화
  • 보안 설정 권장사항: protected-mode, requirepass 설정
  • 정기적 보안 감사: 취약점 점검

8. Redis 모니터링 및 관리 도구 📊

8.1 내장 도구

  • redis-cli: 기본 명령행 인터페이스
    • 모니터 모드: MONITOR 명령으로 실시간 명령 추적
    • 통계 모드: --stat 옵션으로 실시간 통계 확인
    • 지연 시간 모니터링: --latency 옵션
  • redis-benchmark: 성능 벤치마킹 도구

8.2 외부 모니터링 도구

  • Redis Insight: Redis Labs의 공식 GUI 도구
  • Redis Commander: 웹 기반 관리 인터페이스
  • RedisGraph: 그래프 기반 모니터링
  • Prometheus + Grafana: 메트릭 수집 및 시각화
  • Datadog/New Relic: 상용 모니터링 솔루션

8.3 주요 모니터링 지표

  • 메모리 사용량: used_memory, used_memory_rss
  • 히트 레이트: keyspace_hits, keyspace_misses
  • 클라이언트 연결: connected_clients
  • 명령 처리율: instantaneous_ops_per_sec
  • 네트워크 대역폭: instantaneous_input/output_kbps
  • 복제 지연: master_repl_offset, slave_repl_offset

9. Redis 활용 패턴 및 사례 연구 🚀

9.1 캐싱 패턴

  • 캐시 전략: Cache-Aside, Write-Through, Write-Behind
  • 캐시 무효화: TTL 기반, 이벤트 기반
  • 핫키 문제: 특정 키에 대한 과도한 접근 처리
  • 콜드 캐시: 초기화 전략 및 웜업

9.2 세션 관리

  • 구현 방식: 해시 또는 문자열로 세션 저장
  • TTL 활용: 세션 만료 자동화
  • 분산 환경: 중앙 집중식 세션 관리

9.3 실시간 분석

  • 카운터 구현: INCR/INCRBY 활용
  • 시계열 데이터: 정밀도에 따른 다중 카운터
  • 고유 방문자: HyperLogLog 활용
  • 슬라이딩 윈도우: Sorted Sets로 시간 기반 분석

9.4 메시징 시스템

  • Pub/Sub: 실시간 메시지 브로드캐스팅
  • 스트림: 내구성 있는 메시지 큐
  • 소비자 그룹: 작업 분산 처리
  • 지연 큐: Sorted Sets를 활용한 스케줄링

9.5 레이트 리미팅

  • 고정 윈도우: 단순 카운터 기반
  • 슬라이딩 윈도우: Sorted Sets 활용
  • 토큰 버킷: 점진적 토큰 보충
  • 분산 환경: 클러스터 간 동기화 전략

9.6 지리공간 응용

  • 위치 기반 검색: GEOSEARCH 활용
  • 근접성 알림: 반경 내 객체 찾기
  • 배송 추적: 실시간 위치 업데이트

10. Redis 확장 및 생태계 🌱

10.1 Redis 모듈

  • RedisJSON: JSON 데이터 타입 및 조작
  • RediSearch: 전체 텍스트 검색 엔진
  • RedisGraph: 그래프 데이터베이스
  • RedisTimeSeries: 시계열 데이터 처리
  • RedisAI: 머신러닝 모델 서빙
  • RedisGears: 서버 측 프로그래밍 프레임워크

10.2 클라우드 서비스

  • Redis Enterprise: Redis Labs의 상용 확장 버전
  • AWS ElastiCache: 관리형 Redis 서비스
  • Azure Cache for Redis: Microsoft의 Redis 서비스
  • Google Cloud Memorystore: GCP의 Redis 서비스

10.3 클라이언트 라이브러리

  • Java: Jedis, Lettuce, Redisson
  • Python: redis-py, aioredis
  • Node.js: node-redis, ioredis
  • Go: go-redis, redigo
  • C#: StackExchange.Redis
  • PHP: Predis, PhpRedis

11. Redis 최신 동향 및 미래 전망 🔮

11.1 Redis 7.0 주요 기능

  • 함수: Redis 함수 등록 및 실행
  • ACL 개선: 더 세분화된 권한 제어
  • 샤딩 개선: 클러스터 리샤딩 효율성 향상
  • 명령어 인트로스펙션: 명령 메타데이터 접근

11.2 Redis Stack

  • 통합 패키지: 핵심 Redis + 주요 모듈
  • 개발자 경험: 향상된 데이터 모델링 도구
  • 사용 사례 확장: 검색, 시계열, 그래프 등 통합

11.3 미래 로드맵

  • 멀티 스레딩: I/O 처리 병렬화
  • CRDT: 충돌 없는 복제 데이터 타입
  • 향상된 지속성: 더 효율적인 스냅샷 및 복구
  • 에지 컴퓨팅: 경량 Redis 인스턴스

'Back-End' 카테고리의 다른 글

[Spring boot] 중앙 집중식 예외 처리  (2) 2025.08.14
동기와 비동기  (1) 2025.05.30
[Java] JPA 영속성  (1) 2025.05.23
[DDD] 도메인 주도 설계 애그리거트  (0) 2025.05.22
[Spring] Mybatis  (1) 2025.05.08