레디스 (Redis)
한눈에 보기
레디스는 모든 데이터를 메모리에서 처리하는 인메모리 키-값 저장소다. 단일 스레드 구조가 빠른 이유, 주요 자료구조, RDB와 AOF 영속성, 캐싱 전략, 센티널과 클러스터 구성을 정리한다.
최종 업데이트 2026.09.17
레디스(Redis)는 모든 데이터를 메모리에 저장하고 처리하는 오픈소스 인메모리(In-Memory) 키-값 저장소다. 마이크로초 단위의 빠른 응답 속도와 문자열, 리스트, 해시, 집합 같은 다양한 자료구조를 제공해서 캐시, 세션 저장소, 실시간 순위표, 분산 락, 메시지 브로커 등 폭넓은 용도로 사용된다.
레디스의 핵심 특징
레디스가 빠른 첫 번째 이유는 데이터를 디스크가 아닌 메모리에서 읽고 쓰기 때문이다. 두 번째 이유는 명령을 처리하는 부분이 단일 스레드(Single Thread) 이벤트 루프로 동작하기 때문이다. 단일 스레드라서 락 경합이나 컨텍스트 스위칭 비용이 없고, 모든 명령이 원자적으로 실행되어 동시성 문제를 단순하게 만든다. 최신 버전은 네트워크 입출력 일부를 별도 스레드로 처리하지만, 명령 실행 자체는 여전히 순차적이다.
단일 스레드 구조의 이면은 하나의 느린 명령이 전체를 막는다는 점이다. 모든 키를 훑는 KEYS 명령이나 거대한 컬렉션을 한 번에 지우는 연산은 운영 환경에서 피하고, 커서 기반으로 나눠 조회하는 SCAN 같은 대안을 사용해야 한다.
주요 자료구조와 용도
| 자료구조 | 설명 | 대표 용도 |
|---|---|---|
| 문자열(String) | 가장 기본 타입으로 텍스트, 숫자, 직렬화된 객체를 저장한다 | 캐시, 카운터, 토큰 저장 |
| 해시(Hash) | 하나의 키 아래 필드-값 쌍을 저장한다 | 사용자 프로필 같은 객체 저장 |
| 리스트(List) | 삽입 순서를 유지하는 양방향 연결 리스트다 | 최근 목록, 간단한 작업 큐 |
| 집합(Set) | 중복 없는 값의 모음으로 교집합, 합집합 연산을 지원한다 | 태그, 방문자 집합, 팔로우 관계 |
| 정렬 집합(Sorted Set) | 각 값에 점수(Score)를 부여해 정렬 상태를 유지한다 | 실시간 랭킹, 우선순위 큐 |
| 기타 | 비트맵(Bitmap), 하이퍼로그로그(HyperLogLog), 스트림(Stream), 지리 정보(Geo) | 출석 체크, 근사 카운팅, 이벤트 로그 |
단순 키-값 저장소와 달리 서버 쪽에서 자료구조 연산을 바로 수행할 수 있다는 점이 레디스의 큰 강점이다. 예를 들어 랭킹 보드는 정렬 집합의 ZADD와 ZRANGE만으로 구현된다.
영속성: RDB와 AOF
메모리 기반이지만 레디스는 데이터를 디스크에 보존하는 두 가지 방식을 제공한다. RDB(Redis Database)는 특정 시점의 메모리 전체를 스냅숏(Snapshot) 파일로 저장하는 방식이다. 자식 프로세스를 포크(Fork)해서 백그라운드로 저장하므로 서비스 영향이 적고 복구가 빠르지만, 마지막 스냅숏 이후의 변경분은 장애 시 유실된다.
AOF(Append Only File)는 쓰기 명령을 로그 파일에 순차적으로 기록하는 방식이다. 매초 또는 매 명령 단위로 디스크에 동기화할 수 있어 유실 범위가 훨씬 작지만, 파일이 커지고 복구가 느려서 주기적으로 파일을 다시 쓰는 재작성(Rewrite) 과정이 필요하다. 실무에서는 두 방식을 함께 켜서 평소 복구는 RDB로 빠르게 하고 최근 변경분은 AOF로 보전하는 구성이 일반적이다.
캐싱 전략과 만료 정책
레디스의 가장 흔한 용도는 데이터베이스 앞단의 캐시다. 조회 시 캐시를 먼저 확인하고 없으면 데이터베이스에서 읽어 캐시에 채우는 캐시 어사이드(Cache-Aside) 패턴이 표준적으로 쓰이며, 쓰기 시점에 캐시와 저장소를 함께 갱신하는 라이트 스루(Write-Through), 캐시에 먼저 쓰고 나중에 반영하는 라이트 백(Write-Back) 전략도 있다.
메모리가 한도에 도달하면 맥스메모리 정책에 따라 기존 키를 제거하는데, 가장 오래 사용되지 않은 키부터 지우는 LRU(Least Recently Used), 사용 빈도가 낮은 키부터 지우는 LFU(Least Frequently Used), 만료 시간이 설정된 키만 대상으로 하는 볼러타일(Volatile) 계열 정책 중에서 선택한다. 캐시 운영 시에는 다수의 키가 동시에 만료되어 데이터베이스로 요청이 몰리는 캐시 스탬피드(Cache Stampede) 문제를 만료 시간 분산이나 락으로 완화해야 한다.
고가용성과 확장
레디스는 복제(Replication)로 마스터의 데이터를 레플리카(Replica)에 비동기 복사해서 읽기 부하 분산과 장애 대비를 한다. 센티널(Sentinel)은 마스터를 감시하다가 장애가 발생하면 레플리카 중 하나를 자동으로 마스터로 승격시키는 고가용성 구성이다. 데이터 자체를 여러 노드에 나눠야 할 만큼 규모가 커지면 레디스 클러스터(Cluster)를 사용하는데, 키를 해시해서 16384개의 해시 슬롯(Hash Slot)에 분배하고 슬롯을 노드들이 나눠 갖는 샤딩(Sharding) 방식으로 수평 확장한다.
복제가 비동기이므로 장애 전환 순간에 일부 쓰기가 유실될 수 있다는 점은 설계 시 감안해야 한다. 그래서 레디스 하나로 분산 락을 구현할 때는 만료 시간 설정과 소유자 검증 같은 안전장치를 반드시 함께 둔다.
면접에서 이렇게 물어본다
- 레디스가 단일 스레드인데도 빠른 이유와, 단일 스레드라서 조심해야 할 명령은 무엇인가.
- RDB와 AOF의 차이, 그리고 실무에서 어떻게 조합해서 쓰는지 설명해 보라.
- 캐시 어사이드 패턴의 동작 흐름과 캐시 일관성 문제를 어떻게 다루는지 설명해 보라.
- 레디스의 자료구조 중 정렬 집합으로 실시간 랭킹을 구현하는 방법을 설명해 보라.
- 센티널과 클러스터의 역할 차이는 무엇이고, 레디스로 분산 락을 만들 때 주의할 점은 무엇인가.
데이터베이스에서 같이 읽기
- 이상 현상 (Anomaly)이상 현상은 테이블 설계가 잘못되어 삽입, 갱신, 삭제 과정에서 데이터 불일치나 손실이 생기는 현상이다. 삽입, 갱신, 삭제 이상의 세 종류와 원인인 함수 종속, 해결책인 정규화까지 예시와 함께 정리한다.
- 데이터베이스 커넥션 풀 (Database Connection Pool)데이터베이스 연결을 미리 만들어 재사용하는 커넥션 풀의 동작 원리와 필요성을 다룬다. HikariCP 설정, 풀 크기 계산, 타임아웃과 고갈 문제를 실무 관점에서 정리했다.
- 인덱스 (Index)인덱스는 컬럼 값과 저장 위치를 별도 자료구조로 정리해 검색 속도를 높이는 장치다. B+Tree 동작 원리, 클러스터드와 논클러스터드 비교, 복합 인덱스와 커버링 인덱스, 설계 시 주의점을 다룬다.
- 데이터베이스 레플리케이션 (Database Replication)원본 데이터베이스의 변경을 레플리카에 복제해 읽기 부하와 장애를 분산하는 구조를 다룬다. 동기와 비동기 복제, 복제 지연, 읽기 일관성과 장애 전환을 정리했다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기