Redis
- 오픈소스
- 인 메모리 데이터 구조 저장소
- 높은 성능/확장성 (주 메모리 RAM에 저장하여 빠른 응답 시간을 보장하며, 단일 서버 뿐 아니라 여러 서버 간 데이터 분산도 지원함)
대기열 관리: 메시지 큐 시스템으로도 사용할 수 있음.
분산 환경 지원: 마스터-슬레이브 복제, 클러스터링 등의 기능을 제공하여 데이터의 가용성과 확장성을 높일 수 있음
동작 방식
- 단일 thread 모델을 기반으로 동작한다. → 모든 요청을 순차적으로 처리한다.
- 클라이언트 연결 → 명령 처리 → 명령 해석 → 데이터 처리 → 응답 반환 → 연결 종료
데이터 저장 방식
- 키-값 형태로 데이터를 저장하는 인메모리 데이터베이스
- 키(Key): 데이터를 구유하게 식별하는 역할.
- 값(Value): 키에 연결된 데이터 값
- 디에터 구조: 다양한 데이터 구조를 제공한다.
확장성을 향상시키기 위한 주요 방법
1) 복제(Replication): 마스터-슬레이브 복제를 지원한다. 마스터 서버에서 발생하는 write를 슬레이브 서버로 비동기적으로 복제한다. 복제를 통해 읽기 작업을 분산시켜 마스터 서버의 부하를 줄인다.
2) 분산 환경(Clustering): 여러 서버에 데이터를 분산하고 처리할 수 있다. 데이터가 여러 서버에 분산되면 처리량을 늘리면서 서버 장애에 대한 내결함성을 제공할 수 있다.
3) 클라이언트 분산(Sharding): 레디스 클라이언트는 여러개의 레디스 서버에 연결하여 데이터를 분산처리 할 수 있다. 샤링을 통해 처리량을 늘리고 부하를 분산시킬 수 있다.
4) 프록시 캐싱: 레디스를 캐싱 레이어로 사용하여 데이터베이스의 부하를 줄일 수 있다. 데이터베이스 쿼리 결과를 레디스에 캐싱하고, 이후 동일한 쿼리에 대한 응답을 레디스에서 제공함으로써 데이터베이스 부하를 감소시킨다.
단점
- 데이터의 영속성: 메모리 기반의 데이터베이스라서 서버 재시작이나 장애 상황에서 데이터를 영구적으로 보존하기 어렵다. 디스크에 저장되지 않고 메모리에만 저장되기 때문에, 서버가 재시작되거나 전원이 꺼지면 손실될 수 있다. 영속성을 보장하기 위해서 RDB, AOF같은 영속성 설정을 활성화해야하는데, 디스크I/O작업을 동반하여 일부 성능 저하가 발생한다.
- 복잡한 쿼리 지원 부족:키-값 저장소로 설계되어있어서 복잡한 쿼리를 지원하지 않는다.
- 데이터 사이즈 제한
- 한정된 데이터 구조
- 트랜잭션의 제한: 트랜잭션 도중에 다른 클라이언트가 데이터를 수정할 수 있으며, 일부 명령어가 실패하더라도 롤백되지 않고 실행될 수 있다.