DevBoi

[Redis] Redis 란 무엇입니까? 본문

Develop/[Redis]

[Redis] Redis 란 무엇입니까?

HiSmith 2022. 4. 12. 13:44
반응형

Redis는 인메모리 데이터베이스 관리 시스템이다.

다른 인메모리 데이터베이스와 달리 다양한 자료구조를 지원한다. (String,List,Sets,Streams,Hashes 등등)

자료구조가 다양해서, 개발의 편의성이 좋아지고, 난이도가 낮아진다.

 

DBMS를 이용하여 DB에 데이터를 저장하고 저장된 데이터를 정렬하여 다시 읽어오는 과정을 가진다면

디스크에 직접 접근을 해야하기때문에 시간이 더 걸린다.

 

NOSQL로서 key-value 타입의 저장소인 레디스의 주요특징은 아래와 같다.

-영속성을 지원하는 인메모리 데이터 저장소

-읽기 성능 증대를 위한 서버 측 복제를 지원

-다양한 서비스에서 사용되며 검증된 기술

-문자열,리스트,해시,셋 정렬된 셋과 같은 다양한 데이터형을 지원한다.

 

 

 

Redis 영속성

레디스는 지속성을 보장하기 위해 데이터를 DISK에 저장할수있다.

서버가 내려가더라도 DISK에 저장된 데이터를 읽어서 메모리에 로딩한다.

 

데이터를 DISK에 저장하는 방식은 크게 두가지다.

RDB - 순간적으로 메모리에 있는 내용을 DISK에 전체를 옮겨담는 방식

AOF - redis의 모든 write/update 연산 자체를 log파일에 기록하는 형태

 

 

캐시서버 사용방법

일반적인 패턴 : Look aside cache

1. 웹 서버는 클라이언트 요청을 받아서 데이터가 존재하는지 캐시를 먼저 확인하고

2. 캐시에 있다면 꺼내주지만, 없다면 DB에서 읽어서 캐시에 저장하고 클라이언트로 리턴해준다.

 

헤비한 데이터의 경우, 배치성으로 메모리에 insert하는 write back 방식이 존재한다.

 

랭킹 산출 서버를 구현한다고 가정해보자

Redis의 Sorted Set을 사용하여, 랭킹 서버를 쉽게 구현이 가능하며 디스크일때 보다 성능이 향상된다.

 

 

Redis는 싱글쓰레드의 특성을 유지하고 있다. 또한 Atomic하다는 특징이 있어, 경합 과정은 피할 수 있다.

따라서, Redis는 여러 서버에서 같은 데이터를 보고싶을때 사용하며,

대표적인 예는 인증 토큰이나, 유저 API limit을 두는 상황에서 많이 사용하고있다.

 

 

Redis collection

-String : 가장 일반적인 형태, key-value로 저장하는 형태이다.

-Set : 중복된 데이터를 담지 않기 위해 사용하는 자료구조이다. 중복된 데이터를 여러번 저장하면, 최종 한번만 저장된다.

-List : Array형식의 데이터 구조이다. List를 사용하면, 처음과 끝에 데이터를 넣고 빼는건 속도가 빠르지만 중간에 데이터를 삽입,삭제 하는건 어려움이 있다.

-Sorted Set : 유저 랭킹보드서버같은 구현에서 사용한다.

(comparator를 내부적으로 가지고 있고, 내부적으로 Iterator는 오름차순으로 데이터를 보여준다.)

 

메모리관리

Redis에서 쓰기 작업이 수행되면, fork()를 수행하고, 메모리 페이지를 복사한 후에 쓰기 연산을 한다.

read 수행시에는 메모리 복사가 발생하지 않는다.

따라서 Redis의 1개 커렉션에 데이터가 많다면, ziplist를 사용하는게 속도는 조금 느려지지만, 메모리는적게 쓰는 방법이다.

 

Redis는 Single Threaded이다. 

따라서 한번에 처리할 수 있는 명령 갯수는 1개이다.

단순 get,set은 초당 10만개 처리가 가능하다고 한다.

처리가 긴 명령 개수가 한개 들어오면 나머지는 무조건 대기를 해야한다.

 

전체 아이템을 순회하거나, 전체 데이터를 플러시하거나 모든 아이템을 다 가져오면, 느려진다.

그래서 keys말고, scan을 사용하는걸로 바꿀수 있다.

 

여러개의 Redis서버를 둔다면, replication을 사용하여 master,slave관계로 데이터들을 맞출수 있다.

AWS redis의 경우 fork없이 실행되기 떄문에 느리지만 안정적이고

reids 서버 각각 많은 replica를 두고있으면, 네트워크 이슈등으로, 재시도 했을때 문제가 발생할 수 있다.

해결 방법은 Redis Clustering 이라는 방법이 존재하여, 해당 방법도 참고하여 공부해보자

 

 

 

 

 

 

 

 

 

반응형

'Develop > [Redis]' 카테고리의 다른 글

[Redis] Cluster vs Sentinel  (0) 2022.04.12
[Redis] TTL이란  (0) 2022.04.12
[Redis] Eviction 정책  (0) 2022.04.12
[Redis] 지원하는 데이터 유형  (0) 2022.04.12
[Redis] Redis 장 단점  (0) 2022.04.12