Redis란?
dictionary 구조(key-value) 형태로 데이터를 저장하고 관리하는 서버
핵심 기능
- Redis는 데이터베이스, 캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 오픈 소스(BSD 라이선스), 인메모리 데이터 구조 저장소
- 문자열, 해시, 목록, 집합, 범위 쿼리가 있는 정렬된 집합, 비트맵, 하이퍼로그 로그, 지리 공간 인덱스 및 스트림과 같은 컬렉션을 제공
- 복제, Lua 스크립팅, LRU 축출, 트랜잭션 및 다양한 수준의 디스크 지속성이 내정되어 있으면 다음을 통해 고가용성을 제공
- Sentinel 및 Redis 클러스터를 통한 자동 파티셔닝을 제공
캐시(Cache)
DP 알고리즘과 비슷하게 나중에 요청올 결과를 미리 저장해두었다가 빠르게 서비스해주는 것을 의미함. 즉, 미리 결과를 저장하고 나중에 요청이 오면 해당 요청에 대해서 DB 또는 API를 참조하지 않고 Cache에 접근하여 요청을 처리하게 됨
Cache가 동작할 수 있는 철학에는 80퍼센트의 결과는 20퍼센트의 원인으로 발생한다는 파레토 법칙에 있음
즉, 이것은 Cache가 효율적일 수 있는 이유가 될 수 있음, 도믄 결과를 캐싱할 필요는 없으며, 우리는 서비스를 할 때 많이 사용되는 20%를 캐싱한다면 전체적으로 영향을 주어 효율을 극대화할 수 있다는 것임
Cache 사용 구조
- look aside cache
look aside cache은 cache에 접근하여 데이터가 존재하는지 판단하고 cache에 존재하지 않는다면 DB, API를 호출함, 대부분 cache를 사용한 개발이 이 프로세스를 따르고 있음
- 웹 서버는 데이터가 존재하는지 cache를 먼저 확인
- cache에 데이터가 존재하면 cache에서 데이터를 가져옴
- 만일 cache에 데이터가 없다면 DB에서 읽어온다
- DB에서 읽어온 데이터를 cache에 다시 저장한다
- Write Back
데이터를 cache에 먼저 저장했다가 특정 시점마다 DB에 전송하는 것, 이렇게 되면 매 요청마다 DB에 접근할 필요 없이 특정 시점이 왔을때만 DB에 접근해 속도저하를 방지할 수 있음
하지만 처음에 cache(메모리)에 먼저 저장하기 때문에 데이터가 날아갈 위험이 있음
인메모리?
장점
인메모리란 컴퓨터의 주기억장치인 RAM에 데이터를 올려서 사용하는 방법을 말함, RAM에 데이터를 저장하게 된다면 메모리 내부에서 처리가 되므로 데이터를 저장하고 조회할 때 하드디스크를 오고 가는 과정을 거치지 않아도 됨
때문에 SSD, HDD 같은 저장공간에서 데이터를 가져오는 것보다 RAM에서 데이터를 가져오는 속도가 많게는 수백배 이상 빠름, 그로인해 Redis는 속도가 빠르다는 장점을 가짐
단점
Redis의 인메모리 저장방식은 빠른 속도를 자랑하는 대신 치명적인 단점이 존재, 바로 용량으로 인해 데이터 유실이 발생할 수 있다는 점
Redis는 인메모리방식이므로 서버의 메모리 용량을 초과하는 데이터를 Redis에서 처리할 경우, 서버 자체에도 문제가 생기며, RAM의 특성인 휘발성(전원이 꺼지면 가지고 있던 데이터가 사라짐)에 따라 RAM에 저장되었던 Redis의 데이터들은 유실될 수 있음, 때문에 메인 데이터베이스로 사용하기에는 무리가 있음
레디스에서도 데이터를 영속적으로 저장하는 방법을 제공하고 있음
하지만 빠르고 간편하게 사용하는 것을 목표로 하는 레디스의 인메모리 방식에는 적합하지 않은 방식이 될 수 있음
Redis 특징
Redis는 cache와 달리 다음과 같은 특징을 가짐
- List, Set, Sorted Set, Hash 등과 같은 Collection을 지원함
- Race condition에 빠질 수 있는 것을 방지함
- Redis는 Single Thread 따라서 Atomic 보장
Race condition예시
- persistence를 지원하여 서버가 꺼지더라도 다시 데이터를 불러들일 수 있음
Redis의 트랜잭션
Redis는 트랜잭션을 지원함, Redis의 트랜잭션을 사용할 경우 명령들을 Queue에 모아두고 한 번에 처리함
하지만 Redis의 트랜잭션은 RDB의 트랜잭션과 다른 점이 존재함, 일반적인 트랜잭션은 작업이 완전히 실행되거나 rollback 되는 원자성을 가지고 있지만 Redis의 트랜잭션은 rollback을 지원하지 않음. 중간에 실패하더라도 실패한 명령을 제외하고 나머지 명령들은 모두 실행 됨
rdb의 원자성 --> 오류발생시 트랜잭션이 롤백
redis의 원자성 --> 하나의 스레드로 동작하며 중간에 다른 요청이 들어오지 않음
- 장점 : 롤백이 없기 때문에 속도가 빠르다
- 단점 : 오류가 그냥 발생해서 문제
Redis의 이점
성능
모든 Redis 데이터는 메모리에 상주하므로 데이터 액세스의 대기 시간을 낮추고 처리량을 높임, 기존 데이터베이스와 달리 인 메모리 데이터 스토어에는 디스크로의 이동이 필요하지 않기 때문에 엔진 대기 시간이 마이크로 초 단위까지 줄어든다.
그 덕에 인 메모리 데이터 스토어는 더 많은 작업을 처리하고 더 빠른 응답 시간을 지원할 수 있음, 따라서 평균 읽기 및 쓰기 작업 속도가 1밀리초 미만이라는 놀랍도록 빠른 성능으로 초당 수백만 건의 작업을 지원할 수 있음.
유연한 데이터 구조
제한적인 데이터 구조를 제공하는 다른 키 값 데이터 스토어와 달리 Redis에서는애플리케이션 요구 사항을 충족할 수 있는 다양한 데이터 구조를 지원함
Redis 데이터 유형
- 문자열 - 최대 512MB 크기의 텍스트 또는 바이너리 데이터
- 목록 - 추가된 순서가 유지되는 문자열 모음
- Sets - 순서가 유지되지 않는 문자열 모음으로 다른 세트 유형과 교차, 통합 및 비교 가능
- Sorted Sets - 값을 기준으로 순서가 지정된 세트
- Hashes - 필드 및 값의 목록을 저장하는 데이터 구조
- Bitmaps - 비트 수준 작업을 제공하는 데이터 유형
- HyperLogLogs - 데이터 집합 내 고유 항목을 추정하기 위한 확률적 데이터 구조
- Streams - 로그 데이터 구조 메시지 대기열
- Geospatial - 경도/위도 기반 항목 맵, '인근'
- JSON - 숫자, 문자열, 부울, 배열 및 기타 개체를 지원하는 명명된 값의 중첩되 반정형 객체
단순성 및 사용 편의성
Redis를 사용하면 더 짧고 단순한 코드로 기존의 복잡한 코드를 작성할 수 있음. Redis에서는 더 짧은 코드를 작성하여 애플리케이션 데이터의 저장, 액세스 및 사용을 지원할 수 있음, Redis를 사용하는 개발자는 기존 데이터베이스의 쿼리 언어와 반대되는 단순한 명령 구조를 사용할 수 있음.
데이터를 조작하고 상호 작용할 수 있는 네이티브 데이터 구조와 많은 옵션이 함께 제공됨, Redis 개발자는 백 개가 넘는 오픈 소스 클라이언트를 사용할 수 있으며, 다수의 언어가 지원 됨.
복제 및 지속성
Redis는 기본-복제 아키텍쳐를 사용하며 비동시식 복제를 지원하므로 여러 복제 서버에 복제될 수 있음, 따라서 주 서버에 장애가 발생하는 경우 요청이 여러 서버로 분산될 수 있으므로 향상도니 읽기 성능과 더 빠른 복구 기능을 제공할 수 있음
지속성을 위해 특정 시점 백업(Redis 데이터 집합을 디스크로 복사)를 지원함
고가용성 및 확장성
Redis는 단일 노드 기본 또는 클러스터링된 토폴리지에서 기본-복제 아키텍처를 제공함, 따라서 가용성이 뛰어난 솔루션을 구축하여 일관된 성능과 안정성을 제공할 수 있음, 클러스터 크기를 조정해야 하는 경우, 스케일업, 스케일인 또는 스케일아웃할 수 있는 다양한 옵션이 제공 됨(수요에 맞춰 클러스터 확장 가능)
오픈 소스
Redis는 AWS를 포함한 역동적인 커뮤니티를 통해 지원되는 오픈 소스 프로젝트임, Redis는 개방형 표준을 기반으로 하고 오픈 데이터 형식을 지원하며 다양한 클라이언트 세트를 제공하므로 공급업체 종속이나 기술 종속이 없음
주요 Redis 사용 사례
캐싱
Redis는 데이터 액세스 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스와 애플리케이션의 로드를 줄일 수 있는 가용성이 뛰어난 인 메모리 캐시 구현에 매우 적합함.
Redis를 사용하면 빈번하게 요청되는 항목을 1밀리초 미만의 응답 시간으로 지원할 수 있고, 고가의 백엔드를 추가하지 않고도 손쉽게 확장하여 더 많은 로드를 처리할 수 있음.
- 예: 데이터베이스 쿼리 결과 캐싱, 영구 세션 캐싱, 웹 페이지 캐싱, 주파수 사용 객체(이미지, 파일, 메타데이터 등) 캐싱은 Redis를 사용한 캐싱의 주요 예
채팅, 메시징 및 대기열
Redis는 패턴 매칭과 다양한 데이터 구조(목록, 정렬된 세트, 해시 등) 옵션으로 게시/구독을 지원함. 따라서 Redis에서는 고성능 채팅방, 실시간 코멘트 스트림, 소셜 미디어 피드 및 서버 상호 통신을 지원할 수 있음(Redis 목록 데이터 구조를 사용하면 간단한 대기열을 손쉽게 구현할 수 있음).
목록은 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있은 메시지 브로커 도는 순환 목록이 필요한 다양한 애플리케이션에 적합함
게임 순위표
Redis는 실시간 순위표 를 구축하려는 게임 개발자에게 인기 있는 서비스임, 요소의 고유성을 제공하면서 점수로 정렬된 목록을 유지하는 Redis Sorted Set 데이터 구조를 사용하기만 하면 됨.
실시간 순위 목록을 생성하는 것은 사용자의 점수가 변경될 때마다 이를 업데이트하는 것만큼 쉬움, 타임스탬프를 점수로 사용함으로써 Sorted Set를 통해 시계열 데이터를 처리할 수도 있음
세션 스토어
고가용성과 지속성을 갖춘 인 메모리 데이터 스토어인 Redis는 인터넷 규모의 애플리케이션을 위해 세션 데이터를 저장 및 관리하려는 애플리케이션 개발자에게 인기 있는 서비스.
Redis는 사용자 프로필, 자격 증명, 세션 상태, 사용자별 개인화 등과 같은 세션 데이터를 관리하는 데 필요한 1밀리초 미만의 지연 시간, 규모 및 복원력을 제공함
다양한 미디어 스트리밍
Redis는 라이브 스트리밍 사용 사례를 지원할 수 있는 빠른 인 메모리 데이터 스토어를 제공함, CDN이 동시에 수백만 명의 모바일 및 데스크톱 사용자에게 비디오를 스트리밍할 수 있도록 사용자 프로필 및 열람 기록에 대한 메타데이터, 수백만 사용자의 인증 정보/토큰, 매니페스트 파일을 저장하는 데 사용할 수 있음
지리 공간
Redis는 대규모 실시간 지리 공간 데이터를 빠르게 관리할 수 있도록 특별히 구축된 인 메모리 데이터 구조 및 연산자를 제공함
지리 공간 데이터를 실시간으로 저장, 처리 및 분석하는 GEOADD, GEODIST, GEORADIUS 및 GEORADIUSBYMEMBER와 같은 명령을 사용하면 Redis에서 쉽고 빠르게 지리 공간을 처리할 수 있음
- 주행 시간, 주행 거리, 안내 표시와 같은 위치 기반 기능을 애플리케이션에 추가할 수 있음
Machine Learning
데이터 중심의 최신 애플리케이션에서 데이터의 막대한 볼륨, 다양성 및 속도를 신속하게 처리하고 의사 결정을 자동화하기 위해서는 기계 학습이 필요함, 게임 및 금융 서비스에서 사기 탐지, 게임 기술에서 실시간 입찰, 데이트 및 가풀 서비스에서 매치메이킹과 같은 사용 사례의 경우, 수십밀리초 이내로 라이브 데이터를 처리하고 의사 결정을 내릴 수 있는 성능이 가장 중요함
기계 학습 모델을 신속하게 구축, 교육 및 배포할 수 있는 빠른 인 메모리 데이터 스토어를 제공함
실시간 분석
Redis는 Apache Kafka, Amazon Kinesis 등과 같은 스트리밍 솔루션에 인 메모리 데이터 스토어로 사용하여 1밀리초 미만의 지연 시간으로 데이터를 수집, 처리 및 분석할 수 있음
소셜 미디어 분석, 광고 타게팅, 개인화 및 IoT와 같은 실시간 분석 사용 사례에 적합함
'항해 99 > Spring' 카테고리의 다른 글
WebSocket - SockJS (0) | 2024.03.28 |
---|---|
WebSocket - 기본 websocket (0) | 2024.03.27 |
MapStruct (0) | 2024.03.22 |
대댓글 기능 구현 (1) | 2024.03.21 |
S3를 이용한 파일 업로드 (0) | 2024.03.20 |