DATABASE · REDIS
Redis 자료구조·패턴·운영 학습 기록. 캐시, 분산 락, Pub/Sub, 세션, 랭킹 등 실전 주제를 묶었다.
[초안] Redis Cache-Aside 패턴: 실전 백엔드 관점의 설계와 함정
Cache-Aside(Lazy Loading)는 Redis를 도입할 때 가장 먼저 마주치는 기본 패턴이다. 이론상 "캐시에 먼저 물어보고 없으면 DB에서 읽어 캐시에 넣는다"는 단순한 흐름이지만, 실제 백엔드 시스템에서는 이 단순함이 다음과 같은 복합적 이슈로 이어진다. - 캐시 일관성: DB가 업데이트된 후 캐시가 여전히 과거 값을 반환하는 상황 - 동시...
[초안] Redis Cluster 운영 실전: 16384 슬롯, 노드 토폴로지 변경, 페일오버
대규모 커머스 환경에서 Redis는 단일 인스턴스로 버틸 수 있는 트래픽을 한참 넘어선다. 올리브영처럼 프로모션·광고 푸시·라이브 방송이 동시에 터지는 도메인에서는 평시 QPS 대비 10배 이상의 스파이크가 일상이고, 캐시 미스 한 번이 곧바로 RDBMS로 전이되어 장애를 만든다. 이때 단일 마스터-슬레이브 구성은 두 가지 한계에 부딪힌다. 첫째, 메모리...
[초안] Redis 고급 패턴 허브 — 여러 문서를 꿰어 읽는 법
> 이 문서는 redis 폴더 안의 개별 심화 문서들을 하나의 맥락으로 묶어주는 허브다. 개념 설명이나 명령어 레퍼런스를 반복하지 않고, '어느 패턴을 언제 쓰는가', '어떤 장애 시나리오에서 어느 문서를 꺼내 드는가', '여러 기법을 어떻게 조합하는가'에 집중한다. 상세 구현과 예제는 각 링크 문서에서 이어서 읽는다. --- Redis를 실무에서 쓰다 보...
[초안] Redis 캐시 무효화 - 커머스 메뉴/프로모션/회원 정합성 실전
커머스 백엔드에서 Redis는 거의 모든 읽기 경로의 핵심이다. 메뉴 트리, 프로모션 배너, 회원 등급/포인트, 매장 영업 정보, 추천 상품처럼 한 번 조회되면 수백\수천 명에게 동일하게 응답되는 데이터는 DB가 아니라 Redis가 받아낸다. 캐시가 막아주지 못하면 메뉴 한 번 클릭에 수십 개의 쿼리가 동시에 RDB에 떨어지고, 트래픽이 몰리는 점심·저녁...
Redis
> "Remote Dictionary Server" — 원격에 위치한 프로세스로 동작하는 인메모리 키-값 데이터 구조 서버 Redis는 단순한 캐시가 아니라 데이터베이스, 캐시, 메시지 브로커, 스트리밍 엔진으로 모두 쓰인다. RAM에서 직접 처리하므로 디스크 기반 DB 대비 수백 배 빠르지만, 용량이 제한적이고 기본적으로 영속성을 보장하지 않는다는 트레이...
Redis Hash와 Lua 스크립트로 잭팟 누적 구현하기
슬롯 게임의 잭팟 시스템을 들여다볼 기회가 생겼다. 구조를 파악하면서 "왜 여기서 Lua를 쓰지?"라는 질문이 생겼고, 그 이유를 이해하고 나서 기록으로 남긴다. --- 프로그레시브 잭팟은 두 가지 사건이 교차하는 구조다. - 누적: 슬롯이 돌아갈 때마다 베팅 금액의 일부가 잭팟 풀에 쌓인다. 초당 수십수백 건의 업데이트가 발생한다. - 당첨: 잭팟 조건이...
Redis Pub/Sub & Stream
Redis는 두 가지 메시지 전달 메커니즘을 제공한다. Pub/Sub은 실시간 브로드캐스트에, Stream은 신뢰성 있는 메시지 큐에 적합하다. 용도가 다르므로 혼동하지 말아야 한다. --- 발행자(Publisher)가 채널에 메시지를 보내면, 해당 채널을 구독 중인 모든 구독자(Subscriber)에게 즉시 전달하는 Fire-and-Forget 방식이다....
Redis Rate Limiting (요청 제한)
특정 사용자/IP/API가 일정 시간 안에 너무 많은 요청을 보내는 것을 막는 기법이다. Redis는 원자적 명령어와 빠른 응답 속도 덕분에 Rate Limiting 구현에 적합하다. --- 가장 단순한 방식. 분 단위나 시간 단위 키를 만들고 INCR로 카운트한다. bash INCR rate:user:1001:202603271430 # 현재 분 카운트 증...
Redis 분산 락 (Distributed Lock)
여러 서버/프로세스가 동일한 자원에 동시에 접근하는 것을 막아야 할 때 Redis를 분산 락 저장소로 사용한다. JVM 내부의 synchronized나 ReentrantLock은 단일 프로세스 안에서만 동작하므로, 다중 서버 환경에서는 외부 저장소 기반의 락이 필요하다. --- - 원자적 SET NX EX: 락 획득과 만료 시간 설정을 하나의 명령어로 처리...
Redis 세션 저장소 (Session Store)
HTTP는 무상태(Stateless) 프로토콜이라 서버가 클라이언트를 기억하지 못한다. 세션은 이 문제를 해결하기 위해 서버 측에 사용자 상태를 저장하는 방식이다. 단일 서버에서는 메모리 세션으로 충분하지만, 다중 서버 환경에서는 서버 간 세션 공유가 필요하다. --- 사용자 로그인 요청 → 로드 밸런서 → 서버 A (세션 생성) 다음 요청...
Redis 실시간 랭킹 (Leaderboard)
실시간 랭킹은 Redis의 Sorted Set(ZSet)이 가장 빛을 발하는 사용 사례다. RDB에서 ORDER BY score DESC 쿼리를 매번 날리는 것과 달리, Sorted Set은 score 기반 정렬 상태를 항상 유지하므로 순위 조회가 O(log N)이다. --- | 방법 | 삽입 | 순위 조회 | 범위 조회 | |------|------|--...
Redis 영속성과 클러스터
Redis는 인메모리 저장소라 프로세스가 재시작되면 기본적으로 데이터가 사라진다. 이를 방지하기 위해 두 가지 영속성(Persistence) 옵션을 제공한다. 특정 시점(Point-in-Time)의 전체 데이터를 바이너리 파일(.rdb)로 저장한다. - SAVE 900 1 — 900초 안에 1건 이상 변경되면 스냅샷 저장 - BGSAVE 명령으로 자식 프로...
Redis 운영 가이드
캐시, 세션, 분산 락 등 다양한 역할로 Redis를 쓰다 보면 성능 한계, 메모리 부족, 장애 대응 같은 운영 이슈를 마주치게 된다. 이 문서는 Redis를 실무에서 운영할 때 알아야 할 것들을 정리한다. --- Redis는 싱글 스레드이므로 성능은 단일 코어 성능에 비례한다. | 조건 | 처리량 (ops/sec) | |------|------------...