Study
Redis, Redis Pub/Sub, Redis Stream( VS Kafka)
kanado
2025. 4. 27. 11:12
1️⃣ Redis(Remote Dictionary Server)란 무엇인가?
= 키-값(key-value) 구조로 데이터를 저장하는 인메모리 데이터 저장소.
Redis의 특징
항목 | 설명 |
인메모리 | 디스크 대신 메모리에 저장해서 빠른 속도 |
Persistence 지원 | 필요하면 디스크에 주기적으로 저장 가능 (AOF, RDB) |
다양한 자료구조 | String, List, Set, Sorted Set, Hash, HyperLogLog 등 |
싱글 스레드 기반 | I/O 멀티플렉싱으로 고성능 유지 (논블로킹) |
Pub/Sub 지원 | 메시지 브로커처럼 채널 기반 발행/구독 가능 |
간단한 설치 및 사용 | 몇 줄 명령어로 바로 사용 가능 |
2️⃣ Redis가 동작하는 원리
1. 인메모리 저장
- 모든 데이터는 RAM(메모리)에 저장.
- → 읽기/쓰기가 수천~수만 QPS(초당 쿼리 수)로 엄청 빠르다.
2. 싱글 스레드 기반 I/O 멀티플렉싱
- Redis 서버 프로세스는 하나의 스레드로 동작.
- 하지만 내부적으로 epoll 같은 기술로 여러 클라이언트 연결을 동시에 처리.
3. 영속성(Persistence)
- 메모리에만 있으면 전원 꺼지면 데이터 손실.
- 그래서 Redis는 두 가지 방식으로 디스크에 저장 가능
- RDB (Redis Database Backup): 특정 시점 스냅샷 저장
- AOF (Append Only File): 모든 명령어 기록 후 복구
- 설정에 따라 "메모리 + 디스크"를 조합해서 안정성을 확보까지 가능
4. 복제와 클러스터링
- Replication: 하나의 Redis 서버를 다른 서버가 복제해서 백업 서버로 유지 가능 (Master-Slave 구조)
- Master: 데이터를 읽고 쓰는 기본 Redis 서버.
- Replica(Slave): Master 서버의 데이터를 그대로 복제해 읽기 전용으로 유지.
- → Master가 데이터를 변경하면 그 변경 사항을 Replica에게 자동 전파.
- 읽기 부하 분산 가능 (Replica에서도 읽기 허용 가능).
- 장애 복구 시, Replica를 승격해 Master로 만들 수 있음(replicaof no one 명령 사용).
- 주의할 점은 Replication은 비동기라서, Master 장애 시 데이터 유실 가능성 있음.
- Cluster: 여러 Redis 인스턴스를 샤딩해서(키 분산) 더 큰 데이터를 처리 가능
- 하나의 논리적 Redis를 여러 서버로 나눔.
- 서버를 여러 개로 나눠서 더 많은 데이터를 저장
- 단일 Redis 서버는 메모리 한계(예: 50GB, 100GB)가 있는데, ➔ Cluster는 서버 여러 대로 분산하니까 이론적으로 수백 GB, 수 TB 메모리까지 확장 가능
- 키를 해시(Hash Slot)로 변환해서, 그 해시값에 따라 특정 노드에 저장. → 읽기/쓰기 처리량 증가
- Redis Cluster는 0~16383까지 총 16384개의 해시 슬롯을 가짐.
- 각 노드가 자기 슬롯만 담당하니까, 동시에 여러 노드가 병렬로 읽기/쓰기를 처리함.
- 클라이언트가 키를 Redis Cluster에 요청하면, Cluster는 해당 키의 해시 슬롯을 계산해서 정해진 노드로 바로 라우팅. 각 노드는 자기 담당 슬롯의 키만 저장하고 관리함.
- 각 노드는 자신의 Replica를 가질 수 있음
- 하나의 논리적 Redis를 여러 서버로 나눔.
5. 자료구조
- Redis는 단순한 String 말고도 다양한 자료구조를 지원 가능
자료구조 | 설명 | 예시 |
String | 가장 기본적인 값 | "user:1:name" = "Yunbin" |
List | 순서가 있는 값들의 리스트 | 메시지 큐 |
Set | 중복 없는 집합 | 유저가 가입한 그룹들 |
Sorted Set (ZSet) | 점수에 따라 정렬되는 집합 | 랭킹 시스템 |
Hash | 필드-값 쌍 저장 | 유저 정보 (name, age, etc) |
HyperLogLog | 대략적인 카운팅용 | 유니크 방문자 수 계산 |
3️⃣ Redis Stream
Redis Stream은 시간 순서대로 정렬된 데이터 레코드를 저장하고 관리하는 Redis의 데이터 타입이다. 각각의 레코드는 고유한 ID(타임스탬프 기반)를 가지며, 데이터는 "키-필드(field)-값(value)" 쌍 형태로 저장된다.
✅ Stream은 메시지 큐, 이벤트 로그, 데이터 파이프라인 등에 적합하며, 읽기/쓰기, 소비 그룹(Consumer Group)을 통한 병렬 처리, 메시지 보관 및 재처리 기능을 제공한다.
Redis Streams VS Kafka
- Redis Streams는 최대 길이(메시지 개수)를 지정할 수 있다. Kafka는 byte 또는 ms로 크기를 지정한다.
- Redis Streams는 스트림 안에 "메시지 개수" 기준으로 관리 (예: 10만 개 넘으면 오래된 메시지를 자동 삭제)
- Kafka는 "디스크 용량(byte)" 이나 "시간(ms)" 기준으로 관리. (예: 7일 지나면 메시지를 삭제하거나, 토픽 저장 크기가 1GB 넘으면 삭제)
- Redis Streams는 Hash 처럼 데이터를 저장하고 사용한다. Kafka는 직렬화 가능한 모든 형태로 지정할 수 있다.
- Redis Streams는 기본적으로 Hash Map(키-값 쌍) 구조
- Kafka는 메시지 본문을 자유롭게 Byte 배열로 다룸 → (JSON, Avro, Protobuf, 아무거나 직렬화해서 보낼 수 있음)
- 가장 다른점은 레디스의 컨슈머 그룹은 파티션의 존재 유무라고 볼 수 있다. 스트림처리에 있어 1개의 큐에 여러 컨슈머가 붙어서 데이터를 동시처리하는 것이다. 이런 방식은 데이터 처리 순서를 보장할 수 없다.
- Kafka
- "파티션"은 토픽(Topic)을 여러 조각으로 나눈다. 즉, "토픽 = 여러 파티션들의 집합”
- 병렬 쓰기 가능
- ➔ 여러 Producer가 동시에 다른 파티션에 쓸 수 있어. (성능 올라감)
- 병렬 읽기 가능
- ➔ 여러 Consumer가 서로 다른 파티션을 나눠 읽을 수 있어. (소비 속도 빨라짐)
- 확장성
- ➔ 나중에 파티션 수를 늘리면 시스템을 수평 확장할 수 있어.
- 부하 분산
- ➔ 데이터가 한 군데 몰리지 않고 퍼지니까, 부하가 분산됨.
- "파티션"은 토픽(Topic)을 여러 조각으로 나눈다. 즉, "토픽 = 여러 파티션들의 집합”
- Redis Stream
- Redis Stream은 기본적으로 "하나의 스트림”, Consumer Group이 여러 개 있으면 메시지를 분담해서 읽는 구조.
- 전체 순서가 흐트러질 위험
- 예를 들어
순서 메시지 1 A 주문 2 B 주문 3 C 주문
- Consumer 1: C 주문 먼저 처리 (빨리 읽음)
- Consumer 2: A 주문 늦게 처리 (느리게 읽음)
- Redis Stream은 기본적으로 "하나의 스트림”, Consumer Group이 여러 개 있으면 메시지를 분담해서 읽는 구조.
- Kafka
👉 금융, 주문, 재고 등은 "처리 순서"가 중요한 시스템에서 장애가 발생할 수 있다.
4️⃣ Redis Pub/Sub
레디스 Pub/Sub은 레디스 큐, 스트림과 다르게 모든 구독자(subscriber)에게 메시지를 던지는 시스템이다. 즉, 데이터를 저장하는게 아니기 때문에 구독자가 없으면 데이터는 사라진다. publish 명령어로 데이터를 보내고 subscribe 명령으로 데이터를 받는다.
✅ 누군가 그 채널에 메시지를 발행(PUBLISH) 하면, 그 채널을 구독(SUBSCRIBE) 한 모든 클라이언트가 실시간으로 받아본다.
👉 실시간 푸시만 필요하면 Pub/Sub를 활용해서 빠른 속도로 해결 가능하다.
끝.