Redis는 데이터를 메모리에 두고 키로 읽고 쓰는 인메모리 데이터 저장소입니다. 1ms 미만의 응답 속도 덕분에 캐시, 세션, 랭킹, 분산 락 같은 곳에 주로 쓰이며, 필요하면 디스크에 저장하고 복제와 클러스터로 확장할 수 있습니다.
1. Redis란
Redis(REmote DIctionary Server)는 키-값(Key-Value) 구조로 데이터를 다루는 인메모리 데이터 저장소입니다. 데이터를 디스크가 아닌 메모리에 두기 때문에 일반적인 데이터베이스보다 훨씬 빠르게 읽고 쓸 수 있습니다.
단순히 문자열만 저장하는 캐시가 아니라 리스트, 해시, 정렬된 집합 같은 자료구조를 서버에서 직접 다룰 수 있다는 점이 가장 큰 특징입니다. 그래서 캐시 외에도 랭킹, 대기열, 카운터처럼 다양한 용도로 쓰입니다.
| 항목 | 내용 |
| 저장 위치 | 메모리(RAM), 선택적으로 디스크에 백업 |
| 데이터 모델 | 키-값, 값에 여러 자료구조 사용 가능 |
| 명령 처리 | 단일 스레드 이벤트 루프 |
| 기본 포트 | 6379 |
| 영속성 | RDB 스냅샷, AOF 로그 |
| 확장 | 복제(Replication), Sentinel, Cluster |
2. Redis가 빠른 이유
Redis가 빠른 이유는 크게 두 가지입니다. 첫째, 모든 데이터를 메모리에서 처리하므로 디스크 I/O를 기다리지 않습니다. 둘째, 명령을 하나의 스레드에서 순서대로 처리하기 때문에 락(잠금) 경합이나 컨텍스트 스위칭 비용이 거의 없습니다.
명령 실행은 단일 스레드지만, Redis 6.0부터는 네트워크 읽기와 쓰기를 여러 스레드로 나누는 I/O 스레드 옵션을 제공합니다. 대신 명령 하나가 오래 걸리면 뒤의 모든 요청이 기다리게 되므로, 무거운 명령을 피하는 것이 중요합니다.
3. 주요 자료구조
| 자료구조 | 설명 | 대표 명령 | 활용 예 |
| String | 문자열, 숫자, 바이너리 값 | SET, GET, INCR | 캐시, 카운터 |
| List | 순서가 있는 값 목록 | LPUSH, RPOP | 작업 대기열 |
| Hash | 필드-값 쌍의 묶음 | HSET, HGET | 사용자 정보, 세션 |
| Set | 중복 없는 값 집합 | SADD, SISMEMBER | 태그, 방문자 집계 |
| Sorted Set | 점수 순으로 정렬된 집합 | ZADD, ZREVRANGE | 랭킹, 리더보드 |
| Stream | 추가만 되는 로그형 데이터 | XADD, XREAD | 이벤트 스트림, 메시지 큐 |
| JSON, Vector Set 등 | Redis 8부터 기본 포함 | JSON.SET, VADD | 문서 저장, 벡터 유사도 검색 |
4. 대표 활용 사례
| 용도 | 사용 방식 |
| 캐시 | DB 조회 결과를 TTL(만료 시간)과 함께 저장 |
| 세션 저장소 | 여러 웹 서버가 로그인 세션을 공유 |
| 랭킹 | Sorted Set으로 점수 순위를 실시간 계산 |
| 분산 락 | SET NX PX로 한 서버만 작업하도록 제어 |
| 요청 제한(Rate Limit) | INCR과 EXPIRE로 일정 시간당 요청 수 제한 |
| 메시징 | Pub/Sub, Stream으로 서비스 간 메시지 전달 |
4.1 캐시로 쓰는 방법 (Cache-Aside)
가장 흔한 사용 방식은 애플리케이션이 먼저 Redis를 보고, 없을 때만 DB를 조회한 뒤 결과를 Redis에 넣어 두는 Cache-Aside 패턴입니다.

Cache-Aside 패턴의 조회 흐름
캐시에 값이 있으면(Hit) DB를 거치지 않고 바로 응답합니다. 값이 없으면(Miss) DB에서 읽은 결과를 TTL과 함께 저장해, 다음 요청부터는 Redis에서 응답합니다. TTL을 두는 이유는 DB 데이터가 바뀌었을 때 오래된 캐시가 계속 남지 않도록 하기 위해서입니다.
5. 데이터 영속성: RDB와 AOF
메모리 데이터는 서버가 재시작되면 사라지기 때문에, Redis는 디스크에 저장하는 두 가지 방식을 제공합니다.

RDB 스냅샷과 AOF 로그 비교
| 구분 | RDB | AOF |
| 저장 방식 | 특정 시점의 메모리 전체를 스냅샷으로 저장 | 쓰기 명령을 순서대로 로그 파일에 추가 |
| 유실 범위 | 마지막 스냅샷 이후 데이터 | fsync 설정에 따라 다름 (기본 everysec이면 최대 약 1초) |
| 파일 크기 | 작음 | 큼, 주기적으로 재작성(rewrite) |
| 재시작 속도 | 빠름 | 상대적으로 느림 |
| 적합한 경우 | 백업, 빠른 복구 | 데이터 유실을 최소화해야 할 때 |
둘을 함께 켜면 재시작 시 AOF로 복구하고, RDB는 백업용으로 쓸 수 있습니다. 반대로 캐시로만 쓴다면 영속성을 꺼서 디스크 부하를 없애는 것도 방법입니다.
6. 구성 방식

단일 서버, 복제 + Sentinel, Redis Cluster 구성 비교
| 구성 | 특징 | 장애 대응 | 적합한 규모 |
| 단일 서버 | 설치와 운영이 가장 간단 | 서버 장애 시 서비스 중단 | 개발, 테스트, 작은 캐시 |
| 복제 + Sentinel | Primary 1대와 Replica 여러 대, Sentinel이 상태 감시 |
Primary 장애 시 Replica를 자동 승격 |
고가용성이 필요한 서비스 |
| Redis Cluster | 16,384개 해시 슬롯을 여러 Primary에 나눠 저장 |
슬롯마다 Replica가 대신함 | 메모리 한 대로 부족한 대용량 |
Sentinel은 과반수 판단으로 장애를 결정하기 때문에 보통 3대 이상의 홀수로 구성합니다. Cluster는 데이터를 나눠 담는 만큼, 여러 키를 한 번에 다루는 명령은 같은 슬롯에 있는 키끼리만 쓸 수 있다는 제약이 있습니다.
7. 직접 써 보기
7.1 Docker로 실행
docker run -d --name redis -p 6379:6379 redis:8
docker exec -it redis redis-cli
7.2 기본 명령
127.0.0.1:6379> SET user:1 "kim" EX 300 # 300초 뒤 만료되는 키 저장
OK
127.0.0.1:6379> GET user:1
"kim"
127.0.0.1:6379> TTL user:1 # 남은 만료 시간(초)
(integer) 297
127.0.0.1:6379> INCR page:view # 숫자 1 증가
(integer) 1
127.0.0.1:6379> ZADD rank 100 "a" 250 "b" 180 "c"
(integer) 3
127.0.0.1:6379> ZREVRANGE rank 0 2 WITHSCORES # 점수 높은 순 조회
1) "b"
2) "250"
3) "c"
4) "180"
5) "a"
6) "100"
8. 운영할 때 주의할 점
| 항목 | 내용 |
| 메모리 상한 | maxmemory로 사용량을 제한하고, 캐시 용도라면 maxmemory-policy를 allkeys-lru 등으로 지정합니다. 기본값 noeviction은 가득 차면 쓰기를 거부합니다. |
| KEYS 명령 | 전체 키를 한 번에 훑어 서버를 멈추게 할 수 있으므로 운영에서는 SCAN을 씁니다. |
| 큰 키(Big Key) | 값 하나가 너무 크면 삭제, 전송 시 지연이 생기므로 적당한 크기로 나눕니다. |
| 보안 | 외부에 6379 포트를 열지 않고, ACL 또는 비밀번호와 bind 설정으로 접근을 제한합니다. |
| 영속성 메모리 | RDB 저장과 AOF 재작성은 fork로 동작하므로 여유 메모리를 남겨 둡니다. |
9. 라이선스와 Valkey
Redis는 오랫동안 BSD 라이선스의 오픈소스였지만, 2024년 3월 RSALv2와 SSPLv1로 바뀌었습니다. 이에 Linux Foundation 주도로 BSD 라이선스를 유지한 포크 Valkey가 만들어졌고, 여러 클라우드 서비스가 Valkey를 지원하기 시작했습니다. 이후 Redis는 2025년 5월 Redis 8부터 AGPLv3를 선택지로 추가했습니다.
| 구분 | Redis | Valkey |
| 라이선스 | RSALv2, SSPLv1, AGPLv3 중 선택 | BSD 3-Clause |
| 주도 | Redis Ltd. | Linux Foundation |
| 호환성 | - | Redis 7.2 기반으로 명령과 프로토콜 호환 |
사내 서비스에서 직접 쓰는 경우 대부분 문제가 없지만, Redis를 서비스 형태로 외부에 제공한다면 라이선스 조건을 꼭 확인해야 합니다.
10. 정리
- Redis는 메모리에 데이터를 두는 키-값 저장소로, 다양한 자료구조를 서버에서 직접 다룰 수 있습니다.
- 캐시(Cache-Aside), 세션, 랭킹, 분산 락처럼 빠른 응답이 필요한 곳에 씁니다.
- 영속성은 RDB와 AOF로, 가용성과 확장은 Sentinel과 Cluster로 보완합니다.