Remote Dictionary Server의 약자로 "Key-Value" 구조의 비정형 데이터를 저장 및 관리하기 위한 오픈 소스 기반 비관계형 데이터베이스 관리 시스템
인 메모리 구조
대부분의 데이터베이스 관리 시스템에서는 데이터 저장시 디스크 또는 SSD 에 저장하는 반면 Redis는 인 메모리 데이터 구조로 주 메모리에 저장해 디스크에 액세스할 필요가 없어 검색 시간 지연을 방지하고 CPU 명령을 적게 사용하는 간단한 알고리즘으로 액세스 가능한 대신 휘발성이고 비용이 많이 듬
다양한 데이터 타입 지원
사용 편의성
개발과 운영을 보다 쉽고 빠르게 수행할 수 있도록 여러 도구를 제공함
복제 및 지속성
마스터-슬레이브 아키텍처를 사용해 비동기식 복제를 지원하므로 여러 슬레이브 서버에 복제가 가능함 -> 주 서버에 장애가 발생할 경우 요청이 여러 서버로 분산될 수 있어 향상된 읽기 성능과 복구 기능을 모두 제공함
다수 언어 지원
Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go 등 다수 언어 지원
캐싱
다른 데이터베이스 앞에 배치된 Redis는 성능이 뛰어난 인 메모리 캐시를 생성해 액세스 지연 시간을 줄이고 대용량 처리가 가능하고 관계형 또는 NoSQL의 부담을 줄여줌
세션 관리
세션 키에 대한 TTL과 함께 빠른 Key-Value로 사용하면 보다 편리하게 세션 정보를 관리할 수 있음
실시간 순위표
Redis Sorted Set 데이터 구조를 사용하면 요소가 목록에 유지되고 점수에 따라 정렬되므로 동적 순위표를 생성해 관리 가능
속도 제한
필요한 경우 이벤트 속도를 측정 및 한도가 초과되는 경우 제한을 줄 수 있음
대기열
Redis List 데이터 구조를 사용하면 간단한 영구 대기열을 쉽게 구현 가능함
해당 기능은 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 경우 적합함
채팅 및 메시징
패턴 매칭과 PUB/SUB 표준을 지원하므로 Redis를 사용해 고성능 채팅방, 실시간 코멘트 스트림 및 상호 통신 지원 가능
🔒 RefreshToken 관리
📧 이메일 인증 코드 관리
🚩 캐싱
💳 결제 관련 동시성 제어 기능(이후 SQS 방식으로 변경)
🐾 Redis 기능을 선택할 때 가장 많이 고려한 특징은 인 메모리 구조이다.
그래서 직접 기능 개발을 진행했던 사용자의 로그인 유지를 위해 AccessToken을 시간 별로 재발급해주기 위해 필요했던 RefreshToken과 인증 코드 요청 후 5분 간 메모리 저장이 필요했던 이메일 인증 코드 관리 부분을 Redis를 선택해 관리하게 되었다.
👀 또 직접 개발하진 않은 기능에선 스팟 조회 시 redis로 캐싱 처리를 해줬다.
이 기능은 아무래도 지도로 API 요청이 비교적 쉽고 많을 것으로 예측된 스팟 조회에서 캐싱 처리를 해줬다.
👀 사용자가 결제를 요청했을 때 결제, 재고 관리에서 Redis 싱글스레드 방식으로 동시성 제어를 했다. 하지만 Redis 방식은 단일 스레드에서 이루어지기 때문에 하나의 작업이 지연되면 이후 작업들 역시 지연을 피할 수 없기 때문에 메세지 처리량 조절이 가능한 SQS 방식으로 변경해서 구현했다.