레디스란?
레디스의 개요
Redis(Remote dictionary server)는 고성능 키-값 유형의 인메모리 NoSQL 데이터베이스로, 오픈 소스 기반의 데이터 저장소로 데이터베이스, 캐시, 메시지 브로커 등으로 주로 사용되고 있다.
레디스의 특징
인메모리 데이터베이스
인메모리 형태의 데이터베이스에서는 모든 데이터가 컴퓨터의 메모리에서 관리돼 디스크에 접근하는 과정이 필요 없어 데이터 처리 성능이 굉장히 빠르다.
인 메모리 데이터베이스와 온디스크 데이터베이스의 차이
온디스크 형태의 데이터베이스에서 데이터는 영구적으로 디스크에 저장되며 데이터를 찾을 때에는 직접 디스크에 가서 데이터를 검색하는 과정을 거쳐야 하기 때문에 메모리에 접근하는 속도보다 현저히 느리다.
문제점으로 메모리의 데이터는 휘발성이기 때문에 소실이 될 수 있지만, 이 부분은 데이터 세트를 주기적으로 디스크에 덤프 하거나 각 명령어를 디스크 기반 로그에 추가해 데이터를 백업하여 사용할 수 있다.
단순성
키-값 형태로 데이터를 관리하기 때문에 키에 매핑되는 값에는 문자열, hash, set 등 더욱 복잡하고 다양한 데이터 구조를 저장할 수 있도록 지원하며, 이런 데이터 타입은 프로그래밍의 기본 자료 구조와 밀접한 관련이 있어 추가적인 데이터의 가공 없이 애플리케이션에서 쉽게 사용할 수 있다.
내장된 다양한 자료 구조를 통해 임피던스 불일치를 해소하고 개발을 편리하게 할 수 있도록 지원한다.
Impedance mismatches란 기존 관계형 데이터베이스의 테이블과 프로그래밍 언어 간 데이터 구조, 기능의 차이로 인해 발생하는 충돌을 의미한다.
싱글스레드
메인 스레드 1개와 별도의 스레드 3개, 총 4개의 스레드로 동작을 하지만 클라이언트의 명령어를 처리하는 부분은 싱글 스레드로 동작한다.
장점
- Context Switch가 발생하지 않아 효율적으로 리소스를 사용 가능하다.
- Deadlock이 발생하지 않는다.
단점
- 오래걸리는 명령어를 처리하게 되면 처리하는 동안 다른 명령어를 처리할 수 없다.
- 명령어를 처리하는 동안 다른 명령어들이 이벤트 큐에 저장되어 응답 속도가 저하될 수 있다.
고가용성
자체적으로 HA(High Availability) 기능을 제공한다. 복제를 통해 데이터를 여러 서버에 분산시킬 수 있으며, 센티널은 장애 상황을 탐지해 자동으로 페일오버를 시켜준다. 애플리케이션이 센티널을 이용해 레디스에 연결하는 구조에서는 마스터에 장애가 발생하더라도 레디스로의 엔드포인트를 변경할 필요 없이 페일오버가 완료돼 정상화된 마스터 노드를 사용할 수 있다.
확장성
레디스에서 클러스터 모드를 사용한다면 수평적 확장이 쉽게 가능하다. 데이터는 레디스 클러스터 내에서 자동으로 샤딩된 후 저장되며, 여러 개의 복제본이 생성될 수 있다. 이 데이터의 분리는 데이터베이스 레이어에서 처리되며 애플리케이션에서는 대상 데이터가 어떤 샤드에 있는지 신경 쓰지 않아도 되므로, 레디스를 사용할 때와 동일하게 데이터를 가져오고 저장할 수 있다.
사용 사례
데이터 저장소
인메모리 데이터 구조를 사용해 짧은 대기 시간과 높은 처리량이 필요한 실시간 애플리케이션을 위한 데이터 인프라를 구축할 수 있다. 용량이 큰 데이터 저장소로는 적합하지 않다.
캐싱 및 세션 저장
데이터베이스 쿼리, 복잡한 계산, API 호출 및 세션 상태를 캐싱하는 데 이상적이다.
스트리밍 및 메시징
스트림 데이터 유형을 사용하면 고속 데이터 수집, 메시징, 이벤트 소싱 및 알림이 가능하다.
레디스의 간단한 특징들을 알아보았다. 큰 특징들만 봐도 대략의 레디스를 왜 쓰는지 정도는 파악이 되었지만, 깊게 어떤식으로 사용이 되고 어떻게 동작하는지를 알기 위해서는 레디스는 다양한 특징을 살려 부분적으로도 사용하고 있는 부분들이 많아서 해당 사용사례마다 확인을 해봐야겠다.
주로 캐시, 분산락은 얼추본 걸 정확하게 정리를 하고 메시지 브로커나 검색 기능 부분은 다른 스택과 비교해 보면서 내용을 정리해 보고 사용해 보면서 차이점을 확인해 볼 수 있도록 해야겠다.