공고보면 기술 스택에 Redis가 있는 경우를 왕왕 봤다.
전 실무에서는 대용량데이터를 넣고 통계돌리는 일이 과반수였기 때문에 Redis를 사용할 일이 없었다.
그래서 개인 프로젝트하면서 사용할건데, 막상 Redis 에 대해 자세히 알지 못해서 찾아서 정리해보려고 한다.
1. Redis 란?
Remote Dictionary Server의 약자로 메모리 기반의 Key-Value 저장소이다.
대표적인 In-Memory DataStructure Store로 데이터가 RAM에 저장되어 매우 빠른 읽기/쓰기 속도를 제공한다.
RAM 사용으로 인한 단점은 없을까?
- 비용 문제: 디스크에 비해 비싸기 때문에 대용량 데이터를 저장하려면 비용이 많이 든다.
- 용량 한계: 디스크보다 훨씬 작기 때문에, 너무 많은 데이터를 넣으면 금방 메모리가 가득 찬다.
- 데이터 휘발성: Persistence 설정으로 어느 정도 방지가 가능하지만, 기본적으로 꺼지면 데이터가 사라진다.
- 복잡한 관리: 데이터 크기 관리, eviction(메모리 초과 시 삭제) 정책 설정 등 추가 관리가 필요하다.
In-Memory Data Structure Store?
RAM 안에 다양한 자료구조(문자열, 리스트, 해시, 집합 등)를 저장하는 시스템
- In-Memory: 데이터를 디스크가 아니라 메모리에 저장하는 방식
- Data Structure Store: 단순히 문자열만 저장하는 게 아닌, 다양한 데이터 구조(Data Structrue)를 저장할 수 있는 저장소
2. Redis를 사용하는 주요 이유
- 매우 빠른 속도: 메모리 기반이라 디스크 IO가 없어 빠름
- 다양한 구조 지원: 간단한 캐시부터 복잡한 메시징 시스템까지 가능
- 확장성: 클러스터로 확장 가능
- 간편한 사용법: 명령어가 직관적이고 쉽다
Redis 사용 예시
- 캐시 시스템: DB 부하를 줄이기 위해 조회 결과를 캐싱
- 세션 관리: 로그인 세션을 Redis에 저장
- 메시지 브로커: Pub/Sub 기능을 이용한 채팅, 알림 시스템
- 실시간 순위표: Sorted Set을 이용하여 점수 기반 실시간 랭킹 구현
3.주요 특징
항목 | 설명 |
In-Memory | 데이터를 메모리에 저장하여 디스크보다 빠른 속도를 냄 |
Key-Value 구조 | Key에 다양한 형태의 Value(문자열, 리스트, 해시, 집합, 정렬된 집합 등)를 저장 |
Persistence 지원 | 메모리에만 저장하는 것이 아니라 디스크에 주기적으로 저장하여 데이터 유실을 방지할 수 있음 (RDB, AOF) |
다양한 데이터 타입 | 문자열(String), 리스트(List), 해시(Hash), 집합(Set), 정렬된 집합(Sorted Set) 등을 지원 |
Pub/Sub 지원 | 메시지 큐처럼 Publish/Subscribe 기능 제공 |
트랜잭션 | 명령어들을 하나의 트랜잭션으로 묶어 실행 가능 (MULTI/EXEC) |
Replication | Master-Slave 복제 지원 |
High Availability | Sentinel, Cluster 모드 제공 |
메시지 큐?
프로그램끼리 비동기로 메시지를 주고받기 위한 큐 시스템
(빠른 처리, 비동기 통신, 시스템 간 분리(Decoupling), 부하 완충)
✔ 메시지 큐 기본 개념
역할 | 설명 |
Producer(생산자) | 메시지를 만들어 큐에 집어넣는 쪽 (ex: 주문 요청을 보낸다) |
Queue(큐) | 메시지를 저장하는 공간 (RAM이나 디스크) |
Consumer(소비자) | 큐에 쌓인 메시지를 꺼내서 처리하는 쪽 (ex: 주문을 처리한다) |
✔ 특징:
- 비동기 처리: 생산자(Producer)는 메시지만 던지고 바로 다른 일 하러 간다. 소비자(Consumer)가 나중에 가져간다.
- 비접속성(Decoupling): 생산자와 소비자가 서로 몰라도 된다.
- 내구성: 메시지가 큐에 안전하게 쌓였다가 소비될 수 있다.
4. Redis의 데이터 타입
타입 | 설명 | 예시 |
String | 가장 기본적인 타입 (ex: 문자열, 숫자) | "key1" => "Hello" |
List | 순서가 있는 문자열 리스트 (Queue처럼 사용 가능) | "queue" => ["a", "b", "c"] |
Set | 중복 없는 집합 | "myset" => {"a", "b", "c"} |
Hash | 필드-값 쌍을 저장하는 구조 | "user:1" => {"name": "Alice", "age": "30"} |
Sorted Set | 점수(score)에 따라 정렬된 집합 | "ranking" => [("Alice", 100), ("Bob", 95)] |
5. Redis Persistence (지속성)
방식 | 설명 |
RDB (Redis Database Backup) | 일정 시간마다 전체 데이터를 스냅샷(snapshot)으로 디스크에 저장 |
AOF (Append Only File) | 모든 쓰기 작업을 로그 파일에 기록하여 복구 가능 |
혼합 모드 | RDB + AOF 병행하여 사용 |
6. 기본 명령어
명령어 | 설명 | 예시 |
SET key value | 값 저장 | SET name "Alice" |
GET key | 값 조회 | GET name |
DEL key | 키 삭제 | DEL name |
LPUSH list value | 리스트 왼쪽에 값 추가 | LPUSH queue "a" |
SADD set value | 집합에 값 추가 | SADD myset "apple" |
HSET hash field value | 해시 필드 설정 | HSET user:1 name "Alice" |
ZADD zset score member | 정렬된 집합에 추가 | ZADD ranking 100 "Alice" |
'IT' 카테고리의 다른 글
[데이터] Kaggle (캐글) (0) | 2025.05.05 |
---|---|
[Spring] @Transactional 트랜잭션 어노테이션 (0) | 2025.04.28 |
[JAVA] MyBatis VS JPA (0) | 2025.04.23 |