본문 바로가기
Cache/Redis

[Redis(레디스)] 1. Redis?

by 잭피 2020. 9. 4.

실제 업무를 하면서 Redis를 2번 적용해보았다 (검색, 자동완성)

그런데 업무에 급하게 적용하면서 Redis를 깊게 공부하지 못했다.

이번 기회에 Redis(레디스)를 공부하면서 정리해보려고 한다

Redis가 뭐야? 

Redis(REmote Dictionary Server)

디스크가 아닌 메모리 기반의 'Key - Value' 구조 데이터 저장소

Redis는 NoSQL DBMS로 분류되기도 하고, 

memcached와 같은 인메모리(In-Memory) 솔루션으로 분류되기도 한다 

Redis를 쓰면 뭐가 좋아?

RDBMS에서 SELECT 쿼리문을 날려 데이터들을 FETCH했을 때,

구조상 디스크에서 데이터를 꺼내오는 데, 메모리에서 읽어들이는 것보다 대략 천배 가량 느리다

Redis를 사용하여 DB Read 연산의 부하를 분산시킬 수 있다

 

또한, 다양한 데이터 타입을 지원하여

Key로 참조되는 Value 타입을 다양하게 지정할 수 있다

(List, String, Set, Sorted set ... 등)

 

Redis Type 

1. String 

Redis의 가장 기본적인 데이터형으로 일반적인 문자열을 저장한다

Text 뿐만 아니라, 정수형이나 JPG 같은 바이너리 데이터도 저장가능하다

Redis에는 정수형, 실수형이 따로 없다

Key에 넣을 수 있는 데이터의 최대 크기는 512MB

Key를 어떻게 잡느냐가 중요하다 (분산이 바뀔 수 있음)

 

2. List

하나의 Key에 N개의 데이터를 가지며, 중복하여 저장이 가능하다

List 앞,뒤 데이터를 Push나 Pop할 수 있다 (양방향 링크드 리스트처럼)

ex) Lpush, Rpush, Lpop, Rpop

또한 인덱스를 이용해 원하는 위치 데이터를 빼거나 넣을 수 있다

한 Key에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)

이 데이터형의 값은 설정파일 조건보다 크면 linkedlist 아니면, ziplist로 인코딩된다

 

3. Hashes

필드(hash-key)와 값의 쌍으로 이루어진 테이블을 저장하는 자료구조이다

보통 Object를 저장할 때 사용한다

형태는 lists와 비슷하다 "필드명","필드값"의 연속으로 이루어져 있다

한 key에 포함할 수 있는 field-value 쌍의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)

이 데이터형의 값은 설정파일 조건보다 크면 hashtable 아니면, zipmap으로 인코딩된다

 

4. Set

하나의 Key에 중복되지 않은 데이터 값을 가진다

Key에 속한 데이터들은 정렬되지 않고 find가 빠르다

이 데이터형의 장점은

요소의 추가, 제거 및 존재체크 시 소요시간이 sets에 포함된 요소의 수에 관계없이 일정하다

한 key에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)

이 데이터형의 값은 설정파일 조건보다 크면 hashtable 아니면, intset으로 인코딩된다

 

5. Sorted Set

Set의 자료구조 형태에 score 필드 추가된 데이터 타입 (가중치를 넣을 수 있다)

Sorted Set 내에서 score를 기준으로 내부 정렬이 가능하다

Key에 각 요소들의 값은 유일하지만 score 값은 중복될 수 있다

범위를 대상으로 데이터를 가져올 수 있다

요소의 추가, 제거, 업데이트는 매우 빠른 방법으로 진행된다 (O(logN))

다른 데이터 형의 정렬을 위한 index 값으로도 활용이 가능하다

예를 들어, hashes로 한 객체 데이터를 저장했는데, 한 필드로 정렬이 필요하다면

sorted sets에 요소의 값은 객체 구별 값, score은 정렬을 위한 값을 넣어주면 된다

 

sorted sets는 가장 진보한 redis 데이터형 이라고 한다

그런데 주의할 점이 하나 있다

Sorted Set의 score는 double 타입으로 값이 정확하지 않을 수 있다

이 데이터형의 값은 설정파일 조건보다 크면 skiplist 아니면, ziplist으로 인코딩된다

Redis 어디에 쓰는거야?

Look aside Cache (Lazy Loading)

 

1) 클라이언트가 데이터 요청

2) Redis에 데이터가 있으면 가져옴

3) 없으면 DB에서 데이터를 가져옴 && Redis에 Set

 

이 구조의 장점은 같은 요청이 높은 트래픽으로 들어올 경우, RDBMS read부하를 줄이면서,

레디스의 캐싱 전략으로 빠르게 처리할 수 있다 

글쓴이는 레디스를 트래픽이 높은 서비스에서 캐싱 전략으로만 사용하고 있다

 

 

Write Back

모든 데이터를 캐시에 저장하고, 특정 시점에만 캐시 데이터를 DB에 저장한다

ex) 로그를 캐시에 쌓아두고, 특정 시점마다 DB로 전송 

메모리에 읽고 쓰기 하는게 빠르기 때문에, 로그를 쌓을 때 해당 전략을 사용해도 좋을 것 같다

 

 

 

 

 

댓글