프로젝트를 구현하면서 종종 사용해 온 Redis를 이 글을 통해 전반적인 특징을 알아보고자 합니다.
1. 개요
먼저, Redis는 "Remote Dictionary Server"의 약자로, 오픈소스 기반의 In-Memory 데이터 구조 저장소입니다.
이는 메모리에 데이터에 저장하여 빠른 속도의 읽기 및 쓰기를 지원하고, 캐싱과 세션 관리와 같은 작업에 효율적인 성능을 보여주며, HashMap과 같은 Key-Value 구조로 비관계형(NoSQL) DBMS입니다.
Redis는 현재 가장 인기 있는 Key-Value 저장소로, 다양한 인 메모리 데이터 구조 집합을 제공하여 다양한 사용자 정의 애플리케이션을 보다 효율적으로 개발할 수 있는 환경을 제공합니다.
2. Redis의 주요 특징
1. 다양한 자료 구조 지원
- String : String 데이터 타입에 해당하는 데이터 저장 (default)
- Set : 중복되지 않은 데이터
- Sorted Set : Value에 따라 정렬
- Hash : 필드와 값 목록을 저장
- List : 데이터가 추가되는 순서대로 유지
2. 빠른 성능
보통 디스크 또는 SSD에 저장하는 대부분의 데이터베이스와 달리 주 메모리에 데이터를 저장하는 레디스의 경우, 디스크에 액세스하지 않기에 지연 시간이 최소화되는 특징을 가지고 있다. 또한, SQL문을 사용하지 않아 쿼리문을 사용하지 않더라고 일반적인 작업을 실행하는 데 1ms 미만이 소요됩니다.
3. 영속성
앞서 설명했듯이 메모리에 데이터를 저장하여 빠른 속도로 데이터를 저장 및 조회가 가능합니다. 하지만 메모리 특성인 휘발성때문에 데이터의 분실될 위험이 있습니다. 그렇기에 레디스는 이러한 단점을 보완하고자 데이터에 영속성을 제공하여 메모리에 있는 데이터를 디스크에 백업하는 기능을 제공하며 이는 RDB 방식 혹은 AOF 방식으로 백업합니다.
- AOF (Append Only File) : 조회를 제외한 입력 / 수정 / 삭제 명령이 실행 시 로그에 저장하는 방식
- 입력, 수정, 삭제하는 이벤트를 초 단위로 취합하여 로그 파일로 작성
- 모든 데이터의 변경 기록을 보관하기에 최신 데이터 백업 가능
- RDB 방식에 비해 데이터 유실량이 적지만 지연 시간이 길며 파일의 크기가 크다는 단점
- RDB (Redis DataBase) : 특정 시점의 메모리에 있는 데이터 전체를 바이너리 파일로 저장
- 특정 시간을 간격으로 여러 개의 스냅샷을 생성하고, 데이터를 복원할 경우 스냅샷 파일을 로딩
- 스냅샷 이후 변경된 데이터는 복구할 수 없다는 단점
4. 싱글 스레드 환경
Redis는 단일 스레드로 멀티 스레드에서 발생할 수 있는 동기화 문제 (Race Condition, DeadLock 등)을 방지하여 일관성을 유지할 수 있는 환경을 제공합니다. 그렇기에 시간
3. Redis의 사용 사례
1. 캐싱
- 레디스를 활용한 애플리케이션 아키텍쳐를 살펴보면 보통 다른 데이터베이스보다 "앞"에 위치해 있어, 액세스 지연 시간을 줄이고, 처리량을 늘리며 다른 데이터 베이스(관계형 혹은 NoSQL)에 부담을 덜어줍니다.
2. 세션 관리
- Redis는 세션 관리 작업에 매우 적합합니다. 세션 키와 함께 적절할 TTL(Time To Live)을 설정하여 빠른 키-값 스토어로 사용하면 세션 정보를 관리할 수 있습니다.
ex) JWT 토큰을 활용한 RefreshToken, 인증 코드
3. 실시간 순위표
- Redis에서 다양한 자료 구조를 제공하는 것 중 Sorted Set 데이터 구조를 사용하여 요소가 목록에 유지되고, 점수에 따라 정렬됩니다. 이를 통해 동적 순위표를 생성하여 애플리케이션 확장에 도움을 줄 수 있습니다.
4. 속도 제한
- 이벤트 속도를 측정하고 필요한 경우 제한할 수 있습니다. 클라이언트 API에 연결된 Redis 카운터를 사용하여 특정 기간 동안의 액세스 요청의 수를 세어 한도가 초과되는 경우 제한하는 등의 조치를 취할 수 있습니다.
5. 대기열
- List 대기열 구조를 사용하여 간단한 영구 대기열을 손쉽게 구현할 수 있습니다. Redis List는 자동 작업 및 차단 기능을 제공하여 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적용할 수 있습니다.
6. 채팅 및 메시징
- 패턴 매칭과 더불어 PUB/SUB 표준을 지원합니다. Redis를 사용하여 고성능 채팅방, 실시간 코멘트 스크림 및 서버 상호 통신을 지원할 수 있는 환경을 제공합니다.
4. 마무리
이 밖에도 레디스에 관련하여 배포 모드와 PUB/SUB 표준 그리고 AOP와 RDB에 대한 자세한 내용을 포함하여 포스팅하지는 못했지만, 이 글을 통해 레디스가 무엇이며, 어떤 기능을 수행하고, 어떠한 애플리케이션에 적합하는 지에 대해 간략하게 알아보는 시간을 가졌습니다. 이 글을 읽는 분들께 간략하게나마 도움이 되셨으면 좋겠습니다 :)
출처