(출처 : https://aws.amazon.com/ko/compare/the-difference-between-redis-and-mongodb/ )
Redis와 MongoDB의 차이점?
Remote Dictionary Server(Redis)와 MongoDB는 데이터를 비정형 형식으로 저장하는 NoSQL 데이터베이스입니다. NoSQL 데이터베이스는 테이블, 행, 열을 사용하는 관계형 데이터베이스와 데이터를 다르게 저장합니다. Redis는 데이터를 키-값 쌍으로 저장하는 오픈 소스 인 메모리 데이터베이스입니다. 고성능을 위해 RAM에 데이터를 저장하지만 추가 기능으로 온디스크 영구 스토리지를 제공합니다. MongoDB는 데이터를 직렬화된 JSON 형식으로 저장하는 소스 사용 가능 도큐먼트 데이터베이스입니다. 외부 메모리에 데이터를 저장하지만 엔터프라이즈 에디션에는 인 메모리 스토리지 엔진이 포함되어 있습니다.
데이터 모델: Redis vs. MongoDB
Redis와 MongoDB는 서로 다른 데이터 모델을 사용하고 구조적으로 다르게 데이터를 저장합니다.
Redis
Redis는 데이터를 RAM에 저장하므로 메모리에서 직접 데이터에 액세스할 수 있습니다. 이렇게 하면 응답 지연 시간이 짧아지지만 저장할 수 있는 데이터의 양도 제한됩니다. Redis는 데이터 내구성을 제공하는 스냅샷 및 Append Only File(AOF) 로깅을 통해 데이터 세트를 디스크에 저장합니다.
Redis는 데이터를 키-값 페어로 저장하며, 각 데이터 항목에는 고유한 키가 있습니다. 정렬된 세트, 해시, 세트, 목록 및 문자열과 같은 다양한 데이터 유형을 지원합니다. 키의 길이는 최대 512MB까지 가능합니다.
다음 이미지는 Redis 데이터 모델을 보여줍니다.
MongoDB
MongoDB는 문서 데이터 모델을 따라 주로 외부 메모리 스토리지에 데이터를 저장합니다. 데이터를 직렬화 바이너리 JSON(BSON) 문서로 저장합니다. 최대 문서 크기는 16MB입니다.
MongoDB의 아키텍처는 디스크 공간에 따라 기능을 강화할 수 있으므로 대규모 데이터 볼륨을 확장하는 데 유용합니다. 기업 사용자는 하이브리드 접근 방식에 인 메모리 스토리지 엔진을 사용할 수도 있습니다. 자주 액세스하는 데이터에 메모리 캐싱을 사용하면서도 지속성을 위해 주로 디스크 스토리지에 의존할 수 있습니다.
다음 이미지는 MongoDB 데이터 모델을 보여줍니다.
Redis와 MongoDB의 유사점
Redis와 MongoDB는 모두 유연한 스키마 설계, 수평적 확장성 및 고가용성을 제공하는 NoSQL 데이터베이스입니다. 이를 사용하여 문서 및 이미지와 같은 비정형 데이터를 보다 유연하게 저장할 수 있습니다. 관계형 데이터베이스와 달리 스키마를 사용하지 않는 동적 데이터 모델을 사용할 수 있습니다.
이 두 비관계형 데이터베이스 간에는 다양한 유사점이 있습니다.
보조 인덱싱
Redis와 MongoDB는 보조 인덱싱을 제공합니다. 이 함수를 사용하면 프라이머리 키가 아닌 키 필드에 추가 인덱스를 생성할 수 있습니다. 이러한 추가 인덱스를 만든 후에는 다양한 기준을 검색하면서 데이터를 더 빠르게 쿼리하고 검색할 수 있습니다. 보조 인덱싱은 두 NoSQL 데이터베이스 모두에서 유연성과 쿼리 성능을 개선해 줍니다.
복제
높은 가용성과 내구성을 제공하기 위해 MongoDB와 Redis는 복제 기능을 사용합니다. NoSQL 데이터베이스가 여러 노드에 데이터를 복제하여 이중화를 제공하는 복제 세트(또는 클러스터)를 생성합니다. 두 데이터베이스 모두 쓰기 작업을 허용하는 기본 인스턴스와 기본 인스턴스의 데이터를 복제하는 하나 이상의 보조 인스턴스가 있습니다. 기본 인스턴스에 장애가 발생하면 보조 인스턴스가 기본 인스턴스 역할을 할 수 있습니다.
성능
Redis와 MongoDB 모두 응답 지연 시간이 짧고 처리량이 많은 워크로드를 처리할 수 있습니다. Redis는 인 메모리 데이터베이스이므로 데이터를 메모리에 저장합니다. 이 스토리지 시스템을 통해 Redis는 고속 읽기 및 쓰기 작업을 지원할 수 있습니다. MongoDB는 메모리 스토리지와 디스크 기반 스토리지를 결합하여 속도와 데이터 내구성을 제공합니다.
주요 차이점: Redis와 MongoDB
Redis와 MongoDB는 기능 측면에서도 차이가 있습니다. 이 둘의 다른 몇 가지 주요 차이점은 다음과 같습니다.
크기 조정
MongoDB는 수평적 크기 조정을 통해 대용량의 데이터를 효율적으로 처리할 수 있습니다. 샤딩을 사용하여 여러 리전 및 노드에 데이터를 배포합니다. 샤딩 간 작업을 통해 여러 샤드를 쿼리하고 업데이트할 수 있습니다.
Redis는 MongoDB와 같은 수준의 확장성을 제공하지 않습니다. 기본적으로 Redis는 기본 작업에 단일 샤드만 사용합니다. 해시를 기반으로 샤딩을 수동으로 유지 관리해야 하므로 관리하기가 더 복잡합니다. Redis에는 샤드 간 기능도 없습니다.
가용성
MongoDB와 Redis는 모두 복제를 통한 가용성을 지원합니다. 하지만 MongoDB는 복제본 세트를 사용하여 더 높은 수준의 가용성을 지원합니다. MongoDB는 최대 50개의 데이터 사본을 만들어 여러 노드, 데이터 센터 및 지리적 리전에 분산할 수 있습니다. 자동 장애 조치 메커니즘을 지원하며, 프라이머리 노드가 오프라인 상태가 되면 복제본 중에서 새 프라이머리 노드를 선택합니다.
반면 Redis는 기본적으로 자동 장애 조치 기능 제공하지 않습니다. 특히 복제본이 다른 데이터 센터에 있는 경우 관리자가 수동 장애 조치를 실행합니다. 자동 장애 조치를 원할 경우 Redis Sentinel이라는 별도의 구성 요소를 설정하고 구성해야 합니다.
무결성
MongoDB는 다중 문서 원자성, 일관성, 격리성 및 지속성(ACID) 트랜잭션을 지원합니다. 따라서 여러 작업에서 데이터의 일관성을 유지할 수 있습니다. 다중 문서 트랜잭션을 사용하면 여러 작업을 하나의 단위로 수행할 수 있습니다. 세션 내에서 MongoDB는 모든 변경 사항을 커밋하거나 롤백하므로 ACID 규정 준수가 보장됩니다.
반대로 Redis는 내장 ACID 지원 기능을 제공하지 않습니다. 하지만 MULTI 명령을 사용하여 여러 명령을 단일 원자 연산으로 그룹화할 수 있습니다. 하지만 이것만으로는 해결책이 될 수 없습니다. 또한 Redis는 트랜잭션 내에서 기본적으로 롤백 기능을 지원하지 않으므로 애플리케이션 코드 내에서 롤백 기능을 구현해야 합니다.
쿼리 언어
MongoDB는 쿼리에서 높은 수준의 유연성을 제공하며 복잡한 공간 계산 및 데이터 분석 기능을 수행할 수도 있습니다. MongoDB는 고급 쿼리를 간소화하기 위해 JSON과 유사한 구문을 지원하는 MongoDB 쿼리 언어(MQL)를 사용합니다. MQL을 사용하면 단일 또는 다중 키, 텍스트 검색 및 범위에서 고급 쿼리를 수행할 수 있습니다.
반면 Redis는 복잡한 쿼리 및 검색 기능보다는 빠른 키-값 액세스 작업에 최적화되어 있습니다. Redis는 주로 키를 제공하고 해당 데이터를 검색하는 방식으로 사용됩니다. Redis에는 MQL과 같은 쿼리 언어가 없습니다. 대신 데이터와 상호 작용하기 위한 명령을 다양하게 제공합니다. 예를 들어 GET 명령을 사용하여 해당 키를 제공함으로써 값을 검색할 수 있습니다.
사용 사례 비교: Redis와 MongoDB
쿼리 속도가 빠른 임시 데이터 스토리지의 경우 Redis를 사용하세요. 풍부한 쿼리를 지원하면서 복잡한 데이터를 장기간 영구 저장하려면 MongoDB를 사용하세요.
Redis는 자주 액세스하는 데이터에 대한 빠른 액세스를 제공하므로 캐싱 및 세션 스토리지에 적합합니다. 게시-구독(pub/sub) 메시징 패턴을 기본적으로 지원하므로 실시간 애플리케이션 또는 이벤트 기반 아키텍처에서 사용할 수 있습니다. 또한 속도 제한, 작업 대기열 및 작업 예약 시스템을 구현하는 데 사용할 수 있는 정렬된 세트 및 목록과 같은 고급 데이터 구조를 제공합니다. 또한 데이터를 카운트하고 집계하는 데에도 효율적이므로 순위표 데이터 또는 기타 통계를 추적하는 데 적합합니다.
반면 MongoDB를 사용하면 복잡한 애플리케이션 데이터를 대규모로 저장할 수 있습니다. 스키마를 사용하지 않는 보다 전통적인 데이터베이스 구조와 스토리지를 제공하므로 개발자가 보다 유연한 접근 방식을 취할 수 있습니다. 대용량 쓰기 및 읽기를 효율적으로 처리하고 대규모 데이터 세트를 처리할 수 있습니다. 콘텐츠 관리 또는 대규모 사용자 프로필 관리에 사용할 수 있습니다. 또한 MongoDB에는 지리 공간 인덱스가 내장되어 있으며 공간 쿼리를 지원하므로 위치 기반 애플리케이션 또는 지리 공간 구성 요소가 있는 데이터에 적합합니다.
Redis와 MongoDB를 함께 사용할 수 있나요?
Redis와 MongoDB를 함께 사용하는 것은 많은 애플리케이션에서 흔히 활용되는 전략입니다. Redis의 속도는 MongoDB의 장기 스토리지 기능을 자연스럽게 보완합니다. Redis와 MongoDB를 모두 사용하여 데이터베이스 성능을 최적화하고 확장성을 높이며 애플리케이션을 위한 유연한 시스템을 제공할 수 있습니다.
예를 들어 Redis를 실시간 데이터 처리에 사용할 수 있습니다. Redis는 실시간 데이터 처리 시나리오를 처리하므로 라이브 스트리밍 데이터를 캡처하고 처리하는 데 적합합니다. 그런 다음 Redis로 처리한 데이터 또는 결과를 MongoDB에 저장하여 아카이빙 및 보다 복잡한 통합 분석 작업을 수행할 수 있습니다.
또 다른 예로 Redis와 MongoDB 전반에 걸친 하이브리드 데이터 모델을 들 수 있습니다. Redis의 키-값 스토어와 MongoDB의 문서 지향 모델을 동시에 사용할 수 있습니다. Redis는 자주 액세스하는 메타데이터에 액세스할 수 있는 간단한 시스템을 제공하며, 더 복잡한 데이터 구조에는 MongoDB를 사용할 수 있습니다.
Redis | MongoDB | |
데이터 모델 | 메모리 데이터 스토어의 key-value 기반 | 영구 도큐먼트 데이터베이스 |
확장 | 확장성 크게 제공하지 않음 | 데이터의 수평적 확장, 샤딩 및 파티셔닝을 통한 확장성 제공 |
가용성 | 자동 장애 조치를 위해 클러스터를 모니터링하려면 Redis Sentinel이라는 별도의 구성요소가 필요 | 기본적으로 자동으로 장애 조치됨 |
무결성 | 단일 원자 연산을 생성하는 명령을 제공 롤백은 애플리케이션 코드에서 관리 |
MongoDB는 다중 문서 ACID 트랜잭션 및 롤백을 기본적으로 제공 |
쿼리 언어 | Redis는 쿼리 명령을 사용 | MongoDB는 MongoDB 쿼리 언어(MQL)를 사용하여 데이터를 쿼리하고 조작 |