Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템
DB, Cache, Message Queue, Shared Memory 용도로 사용되며 인메모리 데이터 구조를 가진 저장소
비정형 데이터를 저장, 관리하기 위한 오픈 소스 기반의 NoSQL
*인메모리 (In-Memory) 구조? 컴퓨터의 주기억장치인 RAM에 데이터를 올려서 사용하는 방법
- RAM에 데이터를 저장하게 되면 메모리 내부에서 처리가 되므로
데이터를 저장/조회할 때 하드디스크를 오고가는 과정을 거치지 않아도 되어 속도가 빠름 - 그러나 서버의 메모리 용량을 초과하는 데이터를 처리할 경우, RAM의 특성인 휘발성에 따라 데이터 유실 가능성
- DB는 데이터를 디스크에 직접 저장(write)하기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 x
그러나 매번 디스크에 접근해야하기 때문에 사용자가 많아질 수록 부하가 많아져서 느려질 수 → 캐시 서버를 도입해 사용
이 캐시 서버로 이용할 수 있는 것이 바로 Redis이다. - 같은 요청이 여러번 들어올 때 Redis를 사용함으로써 매번 DB를 거치지 않고
캐시 서버에서 저장해놨던 값을 가져와 DB의 부하 줄이고 서비스의 속도도 느려지지 않게 한다.
-
Key, Value 구조 쿼리를 사용할 필요 x
-
빠른 처리 속도
→ 디스크가 아닌 메모리에서 데이터를 처리하기 때문에 속도가 빠름 -
Data Type(Collection)을 지원
→ 개발의 편의성, 생산성이 좋아지고 난이도가 낮아짐 -
AOF, RDB 방식
→ 인메모리 데이터 저장소가 가지는 휘발성의 특성으로 데이터가 유실될 경우를 방지하여 백업 기능을 제공 -
Redis Sentinel 및 Redis Cluster를 통한 자동 파티셔닝 제공
→ Master와 Slaves로 구성하여 여러대의 복제본을 만들 수 있고, 여러대의 서버로 읽기를 확장 가능 -
String, Lists, Sets, Sorted Sets, Hashes 자료 구조를 지원
-
싱글 스레드
→ 한번에 하나의 명령만 수행이 가능하므로 Race Condition이 거의 발생하지 않음
(중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기 필요)
-
서버 장애 시 운영 플랜
인메모리 데이터 저장소의 특성상, 서버에 장애가 발생 시 데이터 유실 가능성 -
시간 복잡도
Single Threaded 사용으로 한번에 하나의 명령만 수행이 가능 → 처리 시간이 긴 요청의 경우 장애 발생 -
메모리 단편화
크고 작은 데이터를 할당하고 해제하는 과정에서 메모리의 파편화가 발생하여 응답 속도가 느려질 수 -
주기적인 모니터링
메모리 사용량이 너무 많으면 Redis 서버의 성능 저하/장애로 이어질 가능성 → 주기적인 모니터링을 통한 메모리 관리
Redis가 단일 스레드(single-threaded)로 설계된 이유는 주로 성능 최적화, 복잡성 감소, 그리고 데이터 일관성을 유지에 있다.
단일 스레드 모델은 멀티스레드 모델에 비해 설계와 구현이 상대적으로 간단하다.
멀티스레드 환경에서는 동시성 문제(레이스 컨디션, 데드락 등)를 처리하기 위해 복잡한 동기화 메커니즘이 필요하지만,
단일 스레드 환경에서는 이런 문제를 자연스럽게 회피할 수 있다.
동시에 여러 스레드가 동일한 데이터를 수정하려고 할 때 발생할 수 있는 데이터 불일치 문제를 방지한다.
모든 명령어가 순차적으로 처리되기 때문에, 복잡한 락(lock) 메커니즘 없이도 데이터의 일관성을 자연스럽게 유지할 수 있다.
Redis는 주로 메모리 내에서 빠르게 수행되는 I/O 작업을 처리하는 인메모리 데이터베이스로 설계되어, 매우 빠른 응답 시간을 제공한다.
단일 스레드 이벤트 루프(event loop)를 사용함으로써 컨텍스트 스위칭(Context Switching)에 소요되는 오버헤드를 최소화할 수 있다.
Redis는 이벤트 기반(event-driven) 아키텍처를 채택하여 네트워크 요청을 효율적으로 처리한다.
단일 스레드 이벤트 루프는 비동기적으로 여러 클라이언트의 요청을 처리할 수 있으며, 이를 통해 높은 동시성을 구현할 수 있다.
멀티스레드 모델에서는 이러한 비동기 처리의 이점을 충분히 활용하기 어려울 수 있다.