Remote Dictionary Server
의 약자로, 오픈소스 기반의 key-value
구조의 비관계형 데이터베이스 및 캐시 시스템이다. 주로 데이터 베이스, 캐시, 메시지 브로커 등으로 활용된다.
📦 메시지 브로커
어플리케이션 간의 통신을 지원하고 중개하는 소프트웨어 혹은 서비스, 메시지 지향 미들웨어의 한 부분으로 분산 시스템에서 메시지를 안전하게 전달하는데 사용된다.
- 메시지를 받은 후에, 업무가 처리되면 그 메시지는 짧은 시간 내에 삭제된다.
- 데이터 손실의 위험을 가진다. (대신 자원을 효율적으로 쓸 수 있다.)
Redis
는 다양한 데이터 구조를 지원한다. String, List, Set, TreeSet, Hash, BitMap
등이 포함되며, application
단에서 필요한 로직을 DB의 기능으로 줄이며 개발 편의성이 증대되었다.
Redis
는 In-memory
형태의 데이터베이스이다. Disk(HDD,SSD)
에 저장되는 데이터베이스와는 다르게 Memory
에 데이터를 저장하는 데이터 베이스에 해당한다. 일반적인 디스크의 읽기/쓰기가 느리기 때문에, 응답 시간을 줄이고자 설계된 것이 In-memory Database
이다.
In-Memory Database
의 사용이 적합한 서비스는 ms
단위의 응답시간을 요구하는 어플리케이션이나 실시간 분석 서비스이거나, 핵심 비즈니스 데이터는 아니지만, 트래픽이 비교적 많이 몰리는 기능에 적절하다.
📦 In-Memory DB의 특징
- 기존
Disk
에서 데이터를 찾고 메모리에 할당하는 과정이 생략되므로 매우 빠르다.- 메모리 점유가 높아, 서버가 다운되거나, 동작 과정 중 데이터를 유실할 가능성이 있다.
(Redis
설계 시 메모리 할당에 따른 설정이 중요하며, 타 서버,DB
환경과 독립적으로 사용할 것을 권장하는 이유가 된다.)
자주 사용하는 데이터의 경우, 데이터의 복사본을 캐시에 저장하는 것으로, 데이터의 요청이 올 때마다 DB에 접근하여 조회할 필요가 없어지기 때문에 성능을 향상 시킬 수 있다. 단, 어떤 종류의 데이터를 캐싱할지, 어느정도 시간동안 데이터를 캐시에 저장할지 등에 따라 서비스에 긍정적인 영향을 주거나, 악영향을 끼칠 수도 있다.
Redis
에 대한 지침 전략 사례들이 존재한다.
📦 Redis 지침전략
회사별, 서비스별, 사례별로 다르겠지만 통상적으로, 자주 조회되는 데이터이나 결과값이 자주 변동되지 않는 일정한 데이터, 그리고 조회를 하는데 복잡한 연산이 필요한 데이터를 캐싱하도록 권고한다.
캐시를 이용하게 되면 뒤따르는 문제가 있는데 바로 데이터 정합성이다. 캐시에 저장된 데이터와 데이터 베이스의 데이터 정보가 서로 다른 현상을 의미한다.
예를들어 돈 10000원이 저장되어있고, 이를 캐시에 저장했다고 하자. 만약 1000원을 인출하면 DB에는 현재 9000원이 되지만, 이후 동일한 ID를 통해 조회를 하는 경우, 캐싱된 결과인 10000원을 반환할 수도 있는 것이다.
따라서 적절한 캐시 읽기 전략 및 캐시 쓰기 전략을 통해 캐시와 DB
간 데이터 불일치 문제를 극복하면서 동시에 빠른 성능을 잃지 않게 하도록 고심히 연구를 할 필요가 있다.
Redis는 쿼리문이 필요하지 않으며 단순한 명령 구조로 데이터의 저장, 조회가 가능하다. Java, Python, C, C++, C#, JavaScript, PHP, Node.js
등 다수의 언어를 지원한다.
Master-slave
구조를 통해 데이터에 대해 여러개의 백업 복제본을 만드는 것이 가능하다. 일반적으로 서비스는 Master
인스턴스를 통해 데이터 운영이 이루어지며, Master
인스턴스의 생성, 조회, 업데이트 과정은 모두, Slave
에서도 함께 이루어진다. (Slave는 Read-only
로 설정되어 있어 조회만 가능하다.)
어떠한 사유에 의해 Master
인스턴스가 죽게되어도, Slave
인스턴스를 통해 데이터를 조회 할 수 있으며, Master
인스턴스가 실행이 종료되더라도, 남은 Slave
에게 Master 권한을 제공하여, 지속적으로 DB 운영을 이룰 수 있도록 한다.
싱글스레드 방식을 통해, 한 번에 하나의 명령어만 처리하기 때문에 연산 간의 경쟁 상태가 발생하지 않는다. 단,시간 복잡도가 큰 명령어는 다른 요청에 대한 응답 지연을 불러올 수 있으므로 주의할 필요가 있다.