TestForge | Aidevops | 📊 Plogger ✍️ Blog 📚 Docs
plogger

AI DevOps Korea

AI 서비스 개발, 운영, 성능개선을 하나의 루프로 연결합니다

aidevops.kr에서 LLMOps, RAG, AI Agent, 관측성, 평가, 비용-성능 최적화를 실전 운영 관점으로 정리합니다.

Redis 자료구조 완벽 가이드 — String, Hash, List, Set, ZSet

Redis 자료구조 완벽 가이드 — String, Hash, List, Set, ZSet 다이어그램
이 글에서 다루는 핵심 흐름, 아키텍처 구조, 주요 판단 포인트를 한눈에 이해할 수 있도록 정리한 그림입니다.
## String — 기본 키-값
SET user:1:name "Hoon"
SET counter 0
INCR counter          # 원자적 증가 → 1
INCRBY counter 10     # → 11
EXPIRE user:1:name 3600  # 1시간 TTL
TTL user:1:name       # 남은 시간 확인

사용 사례: 세션, 카운터, 캐시

Hash — 객체 저장

HSET user:1 name "Hoon" email "hoon@test.com" age 30
HGET user:1 name       # "Hoon"
HGETALL user:1         # 전체 필드
HDEL user:1 age        # 특정 필드 삭제

사용 사례: 사용자 프로필, 설정값

List — 순서 있는 목록

RPUSH notifications "메시지1" "메시지2"  # 오른쪽 추가
LPUSH notifications "메시지0"            # 왼쪽 추가
LRANGE notifications 0 -1               # 전체 조회
LPOP notifications                       # 왼쪽에서 꺼내기
LLEN notifications                       # 길이

사용 사례: 최근 방문 목록, 메시지 큐, 활동 피드

Set — 중복 없는 집합

SADD tags:post:1 "vue" "javascript" "frontend"
SMEMBERS tags:post:1      # 전체 조회
SISMEMBER tags:post:1 "vue"  # 존재 확인 → 1
SUNION tags:post:1 tags:post:2   # 합집합
SINTER tags:post:1 tags:post:2   # 교집합

사용 사례: 좋아요, 팔로워, 태그

Sorted Set — 점수 기반 정렬

ZADD leaderboard 1500 "user:1"
ZADD leaderboard 2000 "user:2"
ZADD leaderboard 1800 "user:3"

ZREVRANGE leaderboard 0 9 WITHSCORES  # 상위 10명
ZRANK leaderboard "user:1"            # 순위 (0부터)
ZINCRBY leaderboard 100 "user:1"      # 점수 증가

사용 사례: 실시간 랭킹, 우선순위 큐

분산 락 (Distributed Lock)

# SET NX EX — 원자적으로 락 획득
SET lock:resource "lock-value" NX EX 30
# NX: 키가 없을 때만 설정
# EX 30: 30초 후 자동 해제
// Redisson 사용 (Java)
RLock lock = redissonClient.getLock("lock:order:" + orderId);
if (lock.tryLock(5, 30, TimeUnit.SECONDS)) {
    try {
        // 임계 영역
    } finally {
        lock.unlock();
    }
}

운영 환경에서 어려워지는 지점

  • Redis 자료구조의 강점은 의도를 담을 수 있다는 데 있지만, 그만큼 내구성과 일관성 가정을 숨기기도 쉽다.
  • 잘못된 구조 선택은 API 불편보다 운영 고통으로 먼저 드러나는 경우가 많다.
  • 메모리 증가, eviction 정책, persistence 모드는 명령 선택만큼 중요하다.

중요한 아키텍처 결정

  • 구조는 접근 패턴, cardinality, 정렬 요구, 만료 의미를 기준으로 고른다.
  • 해당 데이터에 대해 Redis가 캐시인지, 조정 계층인지, 큐인지, 저지연 주 저장소인지 먼저 정의한다.
  • 데이터 손실 비용에 맞춰 persistence와 eviction 정책을 정렬한다.

실무 예시

자료구조마다 잘 맞는 workload 약속이 다르다.

String -> 단순 캐시 값
Hash -> 사용자/세션 속성
List/Stream -> 순서 있는 작업 항목
Set -> 멤버십 확인
Sorted Set -> 순위와 점수 기반 정렬

피해야 할 안티패턴

  • Redis를 가변 객체 투기장처럼 쓰는 것.
  • key 만료 전략을 무시해 의도치 않은 영구 데이터를 만드는 것.
  • persistence와 replay 기대치 없이 중요한 워크플로우를 Redis에 올리는 것.

운영 체크리스트

  • key 패턴별 메모리 사용량을 검토한다.
  • 운영 트래픽 스파이크에 대한 eviction 정책을 검증한다.
  • key naming과 TTL 규칙의 소유권을 문서화한다.
  • 캐시를 넘는 중요 데이터라면 persistence 복구를 테스트한다.

최종 판단

Redis는 각 구조를 운영 의도와 함께 고를 때 가장 잘 작동한다. 데이터 모델이 모호하면 런타임 동작도 모호해진다.

Continue Reading

다음으로 읽기 좋은 글

다음 탐색

이 주제를 시스템 관점으로 더 이어서 보기