Redis 란?
Redis는 REmote DIctionary Server 의 약자로 주로 애플리케이션 캐시나 빠른 응답 속도를 가진 데이터베이스로 사용되는 오픈 소스 인메모리 NoSQL 키/값 저장소입니다.
Q. 기존 서버에서 사용하고 있는 RDBMS가 있지만 별도로 Redis를 사용하는 이유는?
A. Redis는 디스크나 SSD가 아닌 메모리(RAM)에 데이터를 저장하기 때문에 탁월한 속도, 안정성, 성능을 제공한다. 자세한 내용은 아래에서 다룬다.
장점 및 특징
Redis는 사용자에게 편리한 여러가지 기능을 제공하는데 아래와 같은 기능과 특징을 가지고 있다.
1. 성능
Redis는 데이터를 디스트 또는 SSD에 저장하는 대부분의 데이터베이스와 달리 서버의 주 메모리에 저장하기 때문에 디스크에 엑세스해야 할 필요를 없앰으로써 검색 시간으로 인한 지연을 방지하고 CPU 명령을 적게 사용하는 좀 더 간단한 알고리즘으로 데이터를 엑세스할 수 있다.
2. 유연한 데이터 구조
Redis 는 key-value 형태의 데이터를 저장소로 Redis는 단순히 String뿐만 아니라 다음과 같은 다양한 종료의 데이터 구조를 지원한다.
문자열(string), 해시(hashes), 리스트(list), 집합(sets), 정렬된 집합(sorted sets), 비트맵(bitmap), 하이퍼로그 로그( hyperloglog), 지리공간 인덱스(geospatial indexes), 스트림(streams)
3. 사용 편의점
Redis는 Pub/Sub 기능 메시지를 채널에 게시하여 채널에서 구독자에게 전달하는 기능을 제공하며, 스스로 TTL 시간이 지나면 삭제되는 Time To Live (TTL) 키를 제공한다.
4. 복제 및 지속성
Redis는 Master-Slave 아키텍처를 사용하며 비동기식 복제를 지원하여 데이터가 여러 슬레이브 서버에 복제하여, 주 서버 장애가 발생하는 경우 빠르게 복구 가능 하다.
Redis는 안정성을 제공하기 위해 특정 시점 스냅샷(Redis 데이터 세트를 디스크로 복사)과 데이터가 변경될 때마다 이를 디스크에 저장하는 Append Only File( AOF) 생성을 모두 지원합니다.
두 방법 모두 모두 장애 발생 시 Redis 데이터를 신속하게 복원할 수 있다.
Q. Master-Slave 란?
A. 마스터-슬레이브(master-slave)는 하나 이상의 장치 또는 프로세스(마스터)가 하나 이상의 다른 장치 또는 프로세스(슬레이브)를 제어하는 통신 프로토콜의 모델이다.
5. 여러 개발 언어 지원
Redis 개발자는 백 개가 넘는 오픈 소스 클라이언트를 사용할 수 있으며, Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go를 비롯한 다수의 언어가 지원한다.
6. 싱글 스레드 방식
Redis는 싱글 스레드 방식을 사용하여 한 번에 하나의 명령어만을 처리한다. 따라서 연산을 원자적으로 처리하여 Race Condition(경쟁 상태)가 거의 발생하지 않는다.
단점
앞서 말한 것처럼 Redis는 무적에 가까운 데이터베이스일까?
1. 저장 공간
인 메모리(SSD) 저장 방식으로 빠른 속도를 지원하지만 인메모리의 단점인 저장할 수 있는 데이터가 적다.
그렇기 때문에 용량을 초과하는 데이터를 Redis에서 처리할 경우 서버 자체 문제도 생기지만 인 메모리 특징인 휘발성으로 인해 데이터를 유실할 수 있다.
Q. 그렇다면 데이터 유실을 막을 수 없을까?
A. 앞서 말한 것처럼 Redis의 Append Only File 기능을 통해 백업이 가능하기 때문에 유실을 최소화할 수 있다.
Q. Redis는 저장할 수 있는 공간이 작지만 저장해야하는 데이터가 많고, 캐시도 필요할 경우에는 어떻게 해결할 것인가?
A. RDBMS와 조합하여 Redis를 캐시 용도로만 사용하고 실제 저장해야하는 데이터의 경우 영속적인 RDBMS에 저장하는 방식을 사용할 수 있다. 또한 Redis는 스케일 업 기능을 제공하는데 이는 비용 문제로 이어질 수 있다.
2. 싱글 스레드 구조
Redis는 단일 스레드 모델을 사용하므로, 한 번에 하나의 작업만 처리할 수 있다. 이로 인해 병렬 처리에 제한이 있을 수 있으며, 특히 CPU 사용을 최대로 활용하려는 작업에서 성능에 영향을 줄 수 있다.
사용처
1. 캐싱
가장 흔한 사용 사례 중 하나는 캐싱이다. 데이터베이스에서 빈번하게 요청되지만 자주 변경되지 않는 데이터를 레디스에 캐시하여 빠른 응답 속도를 제공한다. 이를 통해 데이터베이스 부하를 줄이고, 웹 페이지나 애플리케이션의 성능을 향상시킬 수 있다.
Q. 캐싱이란?
A. 파일 복사본을 캐시 또는 임시 저장 위치에 저장하여 보다 빠르게 액세스할 수 있도록 하는 프로세스
2. 세션 관리
Redis는 세션 관리 작업에 매우 적합하다. Redis를 세션 키에 대한 적절한 TTL과 함께 빠른 키 값 스토어로 사용하면 간단하게 세션 정보를 관리할 수 있다.
3. 실시간 메시징 및 큐 (Messaging/Queueing)
PUB/SUB 메커니즘을 활용하여 실시간 메시징을 지원하고, 메시지 큐로서의 역할을 수행한다. 이를 통해 이벤트 기반 아키텍처를 구축하거나 작업을 비동기적으로 처리할 수 있다.