0. 레디스란
레디스(Remote Dictionary Server : Redis)는 인메모리 데이터 구조 저장소로써 빠르게 동작하고, 자료형과 기능이 다양한 비관계형 DB이다.
1. 레디스를 사용하기까지
레디스는 인메모리 DB로서 뛰어난 성능과 간단하고 유연한 DB기능과 간단한 설정이라는 장점이있다.
NoSQL은 특정 데이터 모델 전용 설계, 빠른 속도로 장점이 있고 RDBMS의 특성상 구현하기 어려운 부분도 있다. 그러다보니 우열관계가 아닌 NoSQL과 RDBMS는 Trade-Off 라고 할 수있다.
Redis는 주로 NoSQL범주로 분류되며 최근에는 용도에 따라 RDBMS와 레디스를 함께 사용하는 방식이 늘고있다.
RDBMS의 속도, 일부 데이터 모델 표현에 구현의 복잡성이 있다. 이러한 단점 해결하기 위해 RDBMS의 인덱스 설정, 쿼리 설계, 테이블 정규화 트랜잭션 요건완화 등을 사용하는 방법을 고려할 수있다. 이러한 상황에서는 NoSQL을 사용하는 것이 더 효과적이다.
2. 레디스의 특징
레디스는 속도가 빠르고, 자료형이 풍부해서 다양하게 활용할수 있고, 인메모리 DB이면서 동시에 많은 기능을 갖추었다.
여기서 인메모리 DB란 메모리(RAM)에 데이터를 보관하므로 디스크 입출력 접근을 피하고, 병목 현상도 에방하는 등 처리속도가 뛰어난 DB이다.
레디스는 이점도 있지만 RDBMS와 비교했을 때 용도가 제한되므로 RDBMS와 조합하여 사용한다.
예로들어서 웹 어플리케이션 중에 MySQL 만을 사용해서 데이터를 영구적으로 저장하거나 읽고 쓰고하는 작업을 하는 경우가 많다.
하지만 서비스가 커지거나 복잡해지면 예상대로 동작하지 않을수도 있다. 이런 경우 인덱스 설정이나 쿼리 설계로 해결가능하다.
그럼에도 불구하고 관리 비용이 증가하는 경우가 있다.
이런 상황에서 레디스 장점이 진가를 발휘한다. MySQL로 조회한 것은 캐시 데이터로 레디스에 저장하도록 구성한다. 이렇게하면 구현이 간단해지고, 서비스에서 바른응답을 기대할 수있다.
1. 레디스의 동작 이미지
레디스는 여러 자료형의 복잡한 값이 키와 연결되어 있다. 기존 RDBMS와 다르며 KVS보다도 값이 복잡할 수있다.
2. 다른 DB와는 어떻게 다른가
레디스는 RDBMS와 용도가 다르다
RDBMS는 범용성과 트랜잭션 처리기능이 있다. 레디스는 인메모리 최적화, 다양한 자료형과 기능을 갖추고 있다.
서로간의 강점이 있으므로 함께 사용되는 경우가 많다.
레디스는 멤케시디와 같은 KVS와 자주 비교가 된다.
KVS 비교적 기능이 간단하고 빠른 속도가 요구되므로 레디스와 특징이 유사하다. 하지만 레디스는 다양한 자료형을 통해 복잡한 형식의 데이터를 저장할 수있다.
3. 의존성이 적은 레디스
운영체제에 외부 라이브러리를 따로 설치할 필요가 없도록 구현했다.
4. 레디스의 활용
레디스는 서비스 규모에 상관없이 광범위 하게 이용된다. 웹 뿐만 아니라 배치 메시지 큐, Pub/Sub시스템 구축에도 사용할 수있다.
1) 레디스는 처리성능의 병목현상 해결이 필요한 경우, RDBMS의 다양한 자료형과 기능이 유스케이스에 부합하는 경우
2) RDBMS 에서 여러 테이블을 조인한 결과가 여러번 사용되는 경우 레디스에 캐싱하면 빠른 속도를 기대할 수있다.
5. 속도가 빠르고 기능이 많은 인메모리 저장소
(1) 인메모리 동작 기반으로 처리속도가 빠르다
앞서 언급한 바 있음
(2) 자료형과 기능 및 관련 명령어가 다양하다.
다양한 자료형을 밀리 초 미만으로 응답하면서 복잡한 데이터 구조 저장할 수있으므로 캐시 외 다른 용도로 활용하기 좋다.
(3) 데이터 영속성 기능이 있다.
인메모리이므로 휘발성을 고려할 수밖에 없지만, 레디스에서는 두개의 영속성을 제공함
1) 스냅숏 생성 기능은 기본적으로 활성화 되어 있으며, 설정한 시점에 백업을 생성함
2) RDB외에 장애가 발생했을 때 활용하기 쉬운 AOF도 있다.
(4) 레플리케이션/클러스터 기능을 통한 확장성 및 가용성이 높다.
설정에 따라서 확정성과 가용성 문제를 비교적 깔끔하게 해결가능
(5) 클라이언트/서버 모델 기반의 요청/응답 통신을 할 수있다.
말 그대로
(6) 루아 등 복잡한 로직을 구축하고 원자적으로 처리할 수있다.
루아 스크립트 내장하고있으며 루아 스크립트로 여러개의 레디스 명령을 한번에 수행하 수있다.
루아 스크립트는 RDBMS의 SP와 유사하다.
루아 스크립트로 레디스 서버에 전달하여 일괄적으로 실행할 수있다. 원자적으로 수행가능하다.
(7) 싱글 스레드 요청 이벤트를 주도적으로 처리할 수 있다.
싱글 스레드 주도 처리 모델을 채택하고있다. 싱글스레드 이지만 이벤트 루프를 형성하여 많은 요청 처리가 가능하다.
6. RDBMS와 비교
레디스를 도입하고 활용하기 위해서는 RDBMS와 비교하는 것도 중요하다.
(1) RDBMS의 특징
1) SQL을 통한 강력하고 편리한 표현으로 인해 데이터 모델을 매우 폭넓고 유연하게 표현할 수 있음
2) 데이터의 일관성을 포함한 강력한 ACID 특성을 실현할 수있는 가능성이 있다.
3) 테이블 간의 정합성 유지와 정규화를 통한 중복 제거 등으로 전체적으로 최적화가 가능한 설계를 할 수있다.
(2) RDBMS의 한계점
1) 인덱스 설계를 통해 쿼리 속도를 개선할 수있지만, RDBMS 단독으로는 몇몇 케이스에서 일부 데이터 모델의 표현이나 속도면에서 불만족 스럽다.
이 경우 레디스에 맡기는게 속도나 구현 측면에서 효율적이다.
2) RDBMS는 사전에 스키가마 정의 된 것을 전제로 한다. 스키마를 정의해두면 저장된 데이터가 분산이 어렵고 정합성을 유지하기 쉽다는 이점이 있다.
다만 매일 변화하는 요건에 맞춰 데이터 설계에 변경이 어렵다는 점도 있다.
3) RDBMS 는 구조 정의가 희소한(데이터 전체적으로 값이 없는 필드가 많은 상태) 대규모 데이터 세트 처리가 곤란하다.
반면 레디스는 특정 용도에 특화되어 있으므로 RDBMS와 같은 범용성이 없다. 또한 RDBMS와 같은 강력한 ACID특성이 없으며, 트랜잭션 기능을 일부 희생하기도 한다.
그러나 ACID 특성을 엄격하게 준수하여 트랜잭션을 처리할 필요가 없거나, 트랜잭션 기능 자체가 필요없는 유스케이스가 많다.
에컨데 "RDBMS의 복잡한 처리 결과를 캐싱"하거나, "레디스 자료형을 사용해서 랭킹을 단일 명령어로 가져오는 경우", "일시적으로 일관성 문제등이 발성하더라도 배치 처리와 같은 방식으로 대체하는 경우"
7. Redis에서의 ACID 특성 보장방법 (보충학습)
(1) 원자성
레디스는 실패시 롤백하는 기능이 없다. 그러나 레디스에는 이 용어를 사용한다. 이런 경우에 대해서 앱 개발 중 사전에 감지하여 피할 수 있다.
(2) 영속성
AOF로 appendsync 의 값을 always로 설정하면 쓰기 작업마다 디스크에 플러시 하기 때문에 성능에 영향을 미친다.
AOF가 아닌 스냅숏을 수행하여 데이터를 가져올 때의 영향을 고려하면서도 쓰기 작업 성능을 조절하는 대응도 생각 할 수있다. 하지만 스냅숏의 경우 장애가 발생했을 때 값을 가져온 후 데이터 손실이 발생한다.
그러므로 성능에 미칠 영향을 고려하면서 앱이나 데이터의 성질, 요구사항에 따라 중요 항목을 비교 검토하여 레디스를 어느 부분에 사용하지 설정을 어떻게 할지 고려하는것이 바람직하다.
(3) BASE
NoSQL 관점에서 BASE 성질이 자주 언급된다.
BASE는 분산 시스템에서 확장성의 이점을 얻기위해 트랜잭션을 엄격하게 실행하는 것을 현실적으로 타협한 접근방식
1) BA : Basically Available
데이터가 클러스터 내 노드 간에 분산되어 있어 기본적으로 높은 가용성을 유지하며, 언제든 접근 가능한 상태
2) S : Soft state
분산 시스템 환경에서 노드간 랙이 발생하여 상태를 결정할 수 없는 상황이 발생한 것을 전제로 하는 방식
3) E : Eventually consistent
갱신 직후가 아닌 최종 결과의 정합성만 유지하면 괜찮다는 접근 방식
레디스는 ACID, BASE 어느쪽을 완전히 따르는게 아니라 이용 형태에 따라 각 특성의 속성에 해당하는 부분이 달라진다. 요구에 따라 기능과 설정 선택이 중요하다.
3. 레디스 서버 설정
1. 레디스 동작 테스트
1. redis-server 실행 및 redis-cli 로 접속하기
레디스는 서버/클라이언트 모델을 채택하여 redis-cli 같은 클라이언트로 redis-server를 조작한다.
redis-cli는 cli 로써 명령어를 레디스에 보내 레디스 서버에서 보낸 응답을 읽어올 수있다.
2. redis-cli 동작
SET GREET hello
get GREET
4. 보충학습
(1) KVS(멤케시디)
문제상황
RDBMS의 쿼리 처리시간이 느리고 데이터 조회마다 디스크 접근이 필요해서
1) 정의
키와 값만 저장하는 단순한 구조의 데이터 저장소
2) 특징
메모리에 저장하여 매우 빠르다
단순한 캐시 용도에 특화되어있다.
3) 실무
로그인 세션, 임시 데이터 저장등에 사용
(2) Pub/Sub시스템
문제상황
실시간 알림(채팅, 실시간 주문)을 받기 위해 서버에 계속 요청이 필요해서 (Polling 방식은 비효율적)
1) 정의
메시지를 발행(Publish) 하면 구독(Subscribe)한 모든 클라이언트에 실시한으로 전달되는 구조
2) 예시
채팅방, 실시간 알림
3) 레디스
PUBLISH, SUBSCRIBE 명령어로 구성가능
3) 실무
RabbitMQ, Kafka 같은 메시징 큐의 간단한 대체제로 가능
(3) 유스케이스
레디스 언제 사용에 대한 실제 상황예시
(4) 루아스크립트
문제상황
여러 Redis 명령어를 순차적으로 실행할 때, 중간에 다른 클라이언트 요청이 끼어들어 원자성 깨진다.
-> 여러 명령을 하나의 단일 실행 단위로 처리
1) 정의
레디스 서버 안에 복잡한 명령어 들을 한 번에 처리할 수있게 해주는 스크립트 언어
2) 실무
여러키를 조작하거나 조건문 반복문 필요한경우 이용
(5) 이벤트 루프
문제상황
멀티 스레드 기반 구조는 컨텍스트 스위칭 비용이 커서 단일 요청 처리 성능 저하
-> 비동기 이벤트 기반으로효율적으로 처리 요청
1) 정의
단일 스레드에서 여러 요청을 빠르게 처리하기 위한 비동기 이벤트 기반 처리 모델
(6) BASE
문제상황
ACID 기반 RDBMS 는 성능과 확장성에 한계가 있음
일관성을 희생하더라도 가용성과 속도 우선시
5. 꼭 알고가자. (기억포인트)
(1) 내용
1. 레디스란 무엇인가?
- Redis = 인메모리 기반 NoSQL 키-값 데이터 구조 저장소
- 주요 특징:
- 인메모리라서 속도 매우 빠름
- 다양한 자료형 지원 (String, List, Hash, Set, Sorted Set)
- 캐시, 랭킹, 세션, 메시지 큐 등에서 활용됨
2. 레디스를 쓰는 이유 (RDBMS와의 Trade-Off)
- RDBMS:
- ACID 보장, 정합성 우수, 트랜잭션, JOIN
- 느리고 유연성 낮고, 복잡한 설계 필요
- Redis(NoSQL):
- 속도 빠름, 스키마 없음, 단순한 처리에 유리
- 일관성 약함, 범용 DB 대체 불가
→ 복잡한 데이터 영구 저장은 RDBMS, 빠른 응답 처리나 캐시는 Redis로 분담!
3. 레디스의 핵심 특징
- 인메모리 → 초고속
- 풍부한 자료형 → 단순 캐시를 넘어 다양한 구조 표현 가능
- 영속성:
- RDB (스냅샷)
- AOF (Append Only File)
- 레플리케이션 & 클러스터 → 확장성과 가용성 보장
- 루아 스크립트 → 복잡 로직 원자적 처리
- 싱글 스레드 + 이벤트 루프 → 효율적 비동기 처리
4. 레디스 vs 멤케시디 (KVS 비교)
- 멤케시디: 오직 문자열, 캐시 전용
- 레디스: 다양한 자료형 + 영속성 + 명령어 풍부 → 고급형 KVS
5. 레디스의 ACID & BASE 특성
- Atomicity = 루아 스크립트 / MULTI-EXEC
- Durability = AOF (appendfsync 설정 중요)
- BASE:
- B: Basically Available
- S: Soft State
- E: Eventually Consistent
→ 레디스는 완전한 ACID 보장 아님, 대신 상황에 따라 선택적으로 활용
6. 레디스 활용 유스케이스
- 캐시 (DB 조회 결과 캐싱)
- 세션 저장 (로그인 등)
- 실시간 랭킹 (Sorted Set)
- 메시지 큐 (List + BRPOP)
- Pub/Sub (알림, 이벤트 전파)
7. 명령어 기초
- SET key value
- GET key
- redis-server → 서버 실행
- redis-cli → 클라이언트 접속
(2) 테스트
1) 문제
🧪 Chapter 01: 레디스의 시작 – 테스트 문제
✅ 객관식 (각 문제마다 1개 정답)
Q1. Redis가 속하는 데이터베이스 분류는?
A. 관계형 데이터베이스 (RDBMS)
B. 파일 기반 데이터베이스
C. 키-값 기반 NoSQL
D. 그래프 기반 DBMS
Q2. Redis의 주요 장점이 아닌 것은?
A. 매우 빠른 데이터 처리 속도
B. 다양한 자료형 지원
C. 완전한 ACID 보장
D. 간단한 설치와 설정
Q3. Redis에서 사용하는 두 가지 영속성 메커니즘은?
A. WAL, Snapshot
B. RDB, AOF
C. Replication, Sharding
D. TTL, RPOPLPUSH
Q4. 다음 중 Redis에서 랭킹 기능을 구현할 때 가장 적합한 자료형은?
A. List
B. Set
C. Sorted Set
D. Hash
Q5. 다음 중 Redis의 특징에 해당하지 않는 것은?
A. 싱글 스레드 이벤트 기반 처리
B. 다양한 자료형 지원
C. SQL 기반 쿼리 사용
D. Pub/Sub 기능 제공
✅ 단답형
Q6. Redis에서 여러 명령을 원자적으로 처리하기 위해 사용하는 스크립트 언어는?
→ __________
Q7. 트랜잭션 대신 Eventually Consistent 특성을 중시하는 NoSQL 이론은?
→ __________
Q8. Redis가 기본적으로 사용하는 클라이언트 도구 이름은?
→ __________
Q9. Redis와 자주 비교되는 단순 KVS 시스템 이름은?
→ __________
Q10. Redis가 기본적으로 사용하는 동작 모델은? (스레드 모델)
→ __________
(2) 정답
'서적 > 실전 Redis' 카테고리의 다른 글
| CHAPTER 07 레플리케이션 [PART 02 실전] (2) | 2025.07.08 |
|---|---|
| CHAPTER 06 트러블슈팅 [PART 02 실전] (1) | 2025.07.01 |
| CHAPTER 05 레디스 운용 관리 [PART 02 실전] (2) | 2025.06.24 |
| Chapter 03.고급 기능 [Part1 기초] (2) | 2025.06.09 |
| Chapter 02.자료형과 기능 [Part1 기초] (0) | 2025.05.26 |