Redis (Remote Dictionary Server)는 오픈 소스 인메모리 데이터 구조 저장소로, 데이터베이스, 캐시, 메시지 브로커로 사용할 수 있습니다. 문자열, 세트, 해시, 리스트, 비트맵 등 다양한 데이터 구조를 지원합니다. 높은 성능, 확장성, 다양성으로 널리 알려져 있습니다.
작동 원리 및 구조
- 인메모리 저장소: Redis는 주 메모리(RAM)에 모든 데이터를 저장합니다. 이는 디스크 I/O를 피하고 데이터에 대한 빠른 액세스를 가능하게 합니다.
- 단일 스레드 이벤트 루프: Redis는 단일 스레드와 비동기 I/O를 사용합니다. 모든 명령은 단일 스레드의 이벤트 루프에서 실행되며, 이로 인해 CPU 바운드 작업에서는 병목 현상이 발생할 수 있습니다.
- Key-Value 저장: 기본적으로, Redis는 키와 값의 쌍을 저장합니다. 이 키는 데이터를 참조하는 데 사용되며, 값은 다양한 데이터 구조를 가질 수 있습니다 (문자열, 리스트, 세트, 해시 등).
- 명령어: Redis는 다양한 명령어를 지원하여, 데이터 구조에 대한 복잡한 연산을 실행할 수 있습니다. 예를 들어, 리스트에 대한 LPUSH, **LPOP**과 같은 명령어가 있고, 세트에는 SADD, SMEMBERS 등이 있습니다.
- 지속성 옵션: Redis는 RDB(Redis Database) 스냅샷과 AOF(Append Only File) 로그 파일을 사용하여 데이터를 디스크에 저장할 수 있습니다. 이 두 옵션은 다양한 설정이 가능하므로, 운영 환경의 필요에 따라 사용할 수 있습니다.
- 데이터 복제와 샤딩: 마스터-슬레이브 아키텍처를 통해 데이터를 복제할 수 있습니다. 이를 통해 읽기 쿼리의 성능을 향상시킬 수 있고, 데이터의 안정성을 높일 수 있습니다. 샤딩은 데이터를 여러 서버에 분산시키는 방법입니다, 이로써 수평 확장이 가능해집니다.
- 트랜잭션: Redis는 명령어들을 큐에 저장하고, 한 번에 실행하는 간단한 트랜잭션 메커니즘을 지원합니다.
- Pub/Sub 메커니즘: 메시지 브로킹을 위한 Publish/Subscribe 패턴을 지원합니다. 이를 통해 실시간 채팅, 알림 시스템 등을 구현할 수 있습니다.
- Sentinel과 클러스터: 고가용성과 모니터링을 위해 Redis Sentinel을 사용할 수 있고, 자동 파티셔닝 기능을 위해 Redis Cluster를 사용할 수 있습니다.
장점
- 높은 성능: Redis는 주로 인메모리에서 작동하기 때문에 무척 빠릅니다.
- 확장성: 여러 서버에 데이터를 분할하는 다양한 방법을 제공합니다.
- 데이터 구조: 다양한 데이터 구조를 지원합니다.
- 지속성: 높은 내구성이 필요하든 순수한 캐시로서의 필요에 따라 구성할 수 있습니다.
- 원자성 작업: 이러한 데이터 유형에 대한 복잡한 원자성 작업을 지원합니다.
- 커뮤니티와 생태계: 오픈 소스이고 인기가 있어 많은 커뮤니티 지원이 있습니다.
단점
- 메모리 사용량: 인메모리 데이터베이스인 만큼 확장에 비용이 발생할 수 있습니다.
- 단일 스레드 모델: CPU 바운드 작업에 대한 병목 현상이 될 수 있습니다.
- 지속성 오버헤드: 높은 내구성을 위해 구성되면 성능 비용이 발생합니다.
- 클러스터 모드 복잡성: Redis 클러스터를 설정하고 유지하는 것이 복잡할 수 있습니다.
- 데이터 보안: 기본 보안 모델이며, 데이터를 보호하기 위한 추가 조치가 필요합니다.
운영 원칙
- 인메모리 저장: 모든 데이터는 빠른 액세스를 위해 메모리에 저장됩니다.
- 이벤트 주도 프로그래밍: 명령을 처리하기 위한 이벤트 루프를 사용합니다.
- 지속성 옵션: RDB 스냅샷 및 AOF 로그 파일과 같은 다양한 메커니즘을 통해 데이터를 지속할 수 있습니다.
- 데이터 복제: 마스터-슬레이브 복제를 지원합니다.
- 파티셔닝: 수평 파티셔닝 또는 샤딩을 지원합니다.
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
23.08.29 뮤텍스(Mutex) (0) | 2023.09.06 |
---|---|
23.08.24 node.js (Event 모듈) (0) | 2023.09.03 |
23.08.19 쓰레드(thread) (0) | 2023.08.27 |
23.08.18 프로세스 (Process) (0) | 2023.08.26 |
23.08.17 OAuth (0) | 2023.08.25 |