Redis의 정의
Redis는 Remote Dictionary Server의 약자로, 오픈 소스 인메모리 데이터 구조 스토어이다. 주로 키-값 형태의 데이터 저장소로 사용되며, 고속의 읽기 및 쓰기 성능을 자랑한다. Redis는 다양한 데이터 구조를 지원하는데, 문자열, 해시, 리스트, 세트, 정렬된 세트, 비트맵, 하이퍼로그로그, 지리공간 인덱스 등이 포함된다.
Redis의 원리
Redis는 메모리 내에서 모든 데이터를 저장하며, 필요 시 디스크에 지속적으로 데이터를 저장하여 데이터를 보호한다. 데이터는 메모리에서 직접 읽고 쓰기 때문에 매우 빠른 성능을 제공한다. Redis는 싱글 스레드로 동작하여 동시성 문제가 발생하지 않으며, 이는 데이터 일관성을 유지하는 데 도움이 된다.
Redis의 구조
Redis의 주요 구성 요소는 다음과 같습니다:
- Redis 서버: Redis 인스턴스가 실행되는 서버.
- 클라이언트: Redis 서버와 통신하여 데이터를 읽고 쓰는 응용 프로그램.
- 데이터베이스: Redis 서버 내에서 구분되는 데이터 저장소. 기본적으로 16개의 데이터베이스가 제공되며, 필요에 따라 추가할 수 있습니다.
- 명령어: 클라이언트가 Redis 서버에 보내는 다양한 명령어. 예를 들어 SET, GET, HSET, LPUSH 등이 있습니다.
출처 : NHN FORWORD 2021 레디스 야무지게 사용하기! https://www.youtube.com/watch?v=92NizoBL4uA
Redis의 사용 방법
1. 설치
Linux
sudo apt-get update
sudo apt-get install redis-server
2. 시작
redis-server
3. 클라이언트 접속
redis-cli
4. 기본 명령어
SET mykey "Hello, Redis!"
GET mykey
Redis의 장점
- 고성능:
- Redis는 메모리 내에서 데이터를 처리하므로 디스크 기반의 데이터베이스보다 훨씬 빠른 성능을 자랑한다.
- 초당 수십만 개의 요청을 처리할 수 있는 능력이 있다.
- 다양한 데이터 구조:
- Redis는 문자열, 리스트, 해시, 세트, 정렬된 세트, 비트맵, 하이퍼로그로그, 지리공간 인덱스 등 다양한 데이터 구조를 지원한다.
- 이로 인해 복잡한 데이터 처리와 다양한 용도의 저장이 가능하다.
- 간단한 설치 및 설정:
- Redis는 설치가 간편하고, 설정도 단순하여 빠르게 시작할 수 있다.
- 기본적인 설정만으로도 대부분의 용도에 충분히 사용할 수 있다.
- 내장된 복제 기능:
- Redis는 데이터의 복제 기능을 제공하여, 주/복제 구조를 손쉽게 구성할 수 있다.
- 이를 통해 데이터의 안정성과 가용성을 높일 수 있다.
- 고가용성 지원:
- Redis Sentinel을 사용하면 고가용성을 보장할 수 있다.
- Redis Sentinel
- 장애 발생시 운영 서비스에 영향 없도록(=고가용성) 레디스 마스터 모니터링 및 자동 장애 극복 조치 (=Fail-over) 해주는 서비스
- Redis Sentinel
- Sentinel은 Redis 서버의 상태를 모니터링하고, 장애 발생 시 자동으로 장애 조치를 수행한다.
- Redis Sentinel을 사용하면 고가용성을 보장할 수 있다.
- 스냅샷 및 AOF(Appliance Of File) 지속성:
- 데이터의 백업 및 복구를 위한 스냅샷(snapshot) 기능과 AOF를 통해 데이터의 지속성을 보장한다.
- AOF는 모든 쓰기 명령을 로그 파일에 기록하여 장애 발생 시 데이터를 복구할 수 있게 한다.
- RDB (Redis Database)
- 특정 간격으로 메모리 데이터를 덤프하여 디스크에 저장.
- 메모리에 있는 데이터 전체에서 스냅샷을 작성하고, 이를 디스크로 저장하는 방식
- 특정 시간마다 여러 개의 스냅샷을 생성하고, 데이터를 복원해야 한다면 스냅샷 파일을 그대로 로딩만 하면 됨.
- 하지만, 스냅샷 이후 변경된 데이터는 복구할 수 없음. → 데이터 유실(loss)
- AOF (Append Only File)
- 모든 쓰기 명령을 로그 파일에 기록하여 복구 시 모든 명령을 재실행.
- 데이터가 변경되는 이벤트가 발생하면 이를 모두 로그에 저장하는 방식
- 데이터를 생성, 수정, 삭제하는 이벤트를 초 단위로 취합 및 로그 파일에 작성
- 모든 데이터의 변경 기록들을 보관하고 있으므로 최신 데이터 정보를 백업 가능
- RDB 방식에 비해 데이터 유실량이 적음(초 단위 데이터는 유실 가능).
- RDB 방식보다 로딩 속도가 느리고 와 파일 크기가 큰 것이 단점
- RDB (Redis Database)
- 일부 데이터 손실에 영향을 받지 않는 경우(캐시로만 사용할 때) → RDB
- 장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우 → AOF
- 강력한 내구성이 필요한 경우 → RDB + AOF
- 레디스는 일반적으로 AOF와 RDB를 동시에 사용하여 데이터를 백업한다.
- 분산 시스템 지원:
- Redis Cluster를 통해 데이터 샤딩(sharding) 및 분산 처리를 지원한다.
- 이를 통해 큰 데이터를 분산 처리하고 확장할 수 있다.
Redis의 단점
- 메모리 사용량:
- Redis는 메모리 내에서 데이터를 저장하므로, 많은 양의 데이터를 저장할 경우 상당한 메모리 공간이 필요하다.
- 대규모 데이터를 처리하기 위해서는 고성능의 메모리가 필수적이다.
- 디스크 I/O 제한:
- 기본적으로 메모리에 데이터를 저장하기 때문에 디스크에 대한 I/O 성능이 제한적이다.
- 대용량 데이터를 처리하거나 디스크 기반의 복잡한 쿼리를 수행할 때 성능 저하가 발생할 수 있다.
- 데이터 일관성 문제:
- Redis는 기본적으로 단일 스레드로 동작하여 성능이 뛰어나지만, 복잡한 트랜잭션 처리가 필요한 경우에는 데이터 일관성 문제가 발생할 수 있다
→ Spring @Transactional 이 먹히지 않는다. - 또한, Redis의 기본 트랜잭션 모델은 원자적이지 않아서 모든 상황에서 완벽한 데이터 일관성을 보장하지는 않는다.
- Redis는 기본적으로 단일 스레드로 동작하여 성능이 뛰어나지만, 복잡한 트랜잭션 처리가 필요한 경우에는 데이터 일관성 문제가 발생할 수 있다
- 복잡한 쿼리 지원 부족:
- SQL과 같은 복잡한 쿼리를 지원하지 않는다.
- 복잡한 조인, 서브쿼리 등의 SQL 쿼리 기능이 없기 때문에, 관계형 데이터베이스에 비해 복잡한 데이터 조작이 어렵다.
- 한계된 데이터 크기:
- Redis의 데이터 크기에는 제한이 있다.
- 예를 들어, 하나의 키에 저장할 수 있는 데이터 크기는 제한적이며, 이는 대용량 데이터를 저장하는 데 제약이 될 수 있다.
- 보안 취약점:
- 기본적인 설정만으로는 보안성이 낮을 수 있다.
- 인증, 암호화 등의 보안 설정이 필요하며, 이를 제대로 구성하지 않으면 보안 위협에 노출될 수 있다.
활용 사례
캐싱 (Caching)
Redis는 매우 빠른 읽기 및 쓰기 성능을 제공하기 때문에, 자주 조회되는 데이터를 캐싱하는 데 이상적이다.
예를 들어, 웹 애플리케이션에서 사용자 세션 정보를 Redis에 캐싱하면 데이터베이스 부하를 줄이고 응답 시간을 개선할 수 있다.
예시:
- 세션 관리: 사용자 로그인 세션 정보를 Redis에 저장하여 빠른 조회와 인증을 처리한다.
- 페이지 캐싱: 자주 변경되지 않는 웹 페이지 데이터를 Redis에 저장하여 서버 부하를 줄인다.
실시간 분석 (Real-time Analytics)
Redis의 빠른 처리 속도를 활용하여 실시간 분석 작업을 수행할 수 있다.
특히, 실시간 로그 처리, 모니터링 시스템, 실시간 대시보드 등에 유용하다.
예시:
- 실시간 로그 분석: 실시간으로 수집되는 로그 데이터를 Redis에 저장하고, 이를 기반으로 실시간 분석을 수행한다.
- 실시간 대시보드: 현재 시스템 상태나 사용자 활동을 실시간으로 시각화하여 모니터링한다.
메시지 브로커 (Message Broker)
Redis는 Pub/Sub(pub-sub) 메시징 모델을 제공하여 메시지 큐로 사용할 수 있다.
이를 통해 애플리케이션 간의 비동기 통신을 지원한다.
예시:
- 채팅 애플리케이션: 사용자 간의 메시지를 Pub/Sub 모델을 통해 실시간으로 전달한다.
- 이벤트 알림 시스템: 이벤트 발생 시 관련 사용자나 시스템에 알림 메시지를 전달한다.
지오 스페이셜 인덱싱 (Geospatial Indexing)
Redis는 지리적 데이터 저장과 처리 기능을 제공한다. 이를 통해 위치 기반 애플리케이션에서 사용될 수 있다.
예시:
- 위치 기반 서비스: 사용자 위치를 기반으로 근처의 상점이나 서비스 정보를 제공하는 애플리케이션.
- 물류 및 배송 추적: 차량이나 물류 자산의 실시간 위치 추적.
카운터 및 랭킹 (Counters and Leaderboards)
Redis는 원자적 증가 연산을 지원하므로, 카운터 및 랭킹 시스템에 적합하다.
게임이나 소셜 미디어 애플리케이션에서 자주 사용된다.
예시:
- 게임 리더보드: 게임 플레이어의 점수를 저장하고, 실시간으로 순위를 계산하여 표시한다.
- 웹사이트 방문자 카운터: 웹 페이지 방문 횟수를 실시간으로 추적한다.
데이터 스트리밍 (Data Streaming)
Redis Streams는 대규모 데이터 스트리밍과 처리를 지원한다.
이를 통해 이벤트 소싱이나 데이터 파이프라인 구축이 가능하다.
예시:
- 이벤트 소싱: 애플리케이션 이벤트를 스트리밍하여 이벤트 소싱 패턴을 구현한다.
- 데이터 파이프라인: 데이터 처리를 위한 스트리밍 파이프라인을 구축하여 실시간 데이터 처리를 수행한다.
주의해야 할 점
데이터 손실 가능성
Redis는 인메모리 데이터베이스로, 모든 데이터를 메모리에 저장한다.
따라서 서버 재시작, 장애 발생 시 데이터가 손실될 수 있다. 이를 방지하기 위해 정기적으로 데이터를 디스크에 저장하는 RDB 스냅샷이나 AOF(Append Only File) 설정을 통해 데이터 지속성을 확보해야 한다.
메모리 관리
Redis는 메모리를 많이 사용한다.
데이터 양이 많아지면 메모리가 부족해질 수 있으므로, 데이터 크기와 메모리 사용량을 모니터링하고, 적절한 메모리 관리 설정을 해야 하다.
필요에 따라 LRU(Least Recently Used) 정책을 통해 오래된 데이터를 자동으로 삭제하는 기능을 설정할 수 있다.
클러스터링 및 샤딩
대규모 데이터를 처리하거나 높은 가용성을 유지하기 위해 Redis 클러스터링과 샤딩을 사용한다.
그러나 클러스터링과 샤딩을 설정하고 관리하는 과정은 복잡할 수 있으며, 데이터 분할과 노드 간 통신에 따른 오버헤드를 고려해야 한다.
보안 설정
기본적으로 Redis는 인증과 암호화를 사용하지 않으므로, 보안에 취약할 수 있다.
Redis 서버를 외부에 노출시키지 않도록 하고, 필요에 따라 requirepass 설정을 통해 인증을 요구하며, SSL/TLS를 사용하여 통신을 암호화하는 것이 좋다.
데이터 일관성
Redis는 싱글 스레드로 동작하여 기본적으로 높은 성능을 제공하지만, 복잡한 트랜잭션을 처리할 때 데이터 일관성 문제가 발생할 수 있다.
MULTI/EXEC 명령어를 사용하여 트랜잭션을 관리하되, Redis의 트랜잭션은 모든 명령어가 실행되기 전까지는 큐에 쌓이는 방식으로 동작하므로, 트랜잭션 중간에 문제가 발생하면 일부 명령어만 실행될 수 있다는 점을 유의해야 한다.
Pipelining의 주의점
Redis의 Pipelining 기능을 사용하면 여러 명령어를 한번에 보내어 네트워크 오버헤드를 줄일 수 있다.
그러나 너무 많은 명령어를 한번에 보내면 메모리 사용량이 급격히 증가할 수 있으므로, 적절한 크기로 나누어 사용하는 것이 좋다.
성능 튜닝
Redis의 성능을 최적화하기 위해 설정 파일(redis.conf)을 조정해야 할 때가 있다.
maxmemory, maxclients, timeout 등의 설정을 애플리케이션의 요구사항에 맞춰 조정하고, Redis의 모니터링 도구를 사용하여 성능을 지속적으로 관찰해야 한다.
백업 및 복구
데이터 손실을 방지하기 위해 정기적인 백업이 필요하다.
RDB 스냅샷이나 AOF 로그 파일을 사용하여 백업을 설정하고, 주기적으로 백업 파일의 무결성을 확인하며, 필요시 복구 절차를 숙지해야 한다.
제한된 데이터 구조 크기
Redis는 하나의 키에 저장할 수 있는 데이터 크기에 제한이 있다.
너무 큰 데이터 구조를 사용하면 메모리 사용량이 급격히 증가할 수 있으며, 성능 저하가 발생할 수 있다.
데이터를 분할하거나 다른 데이터베이스와 함께 사용하는 것을 고려해야 한다.