Junuuu 2022. 3. 4. 10:47

Redis란?

공식 홈페이지의 소개글을 요약해 보겠습니다

Redis는 데이터베이스, cache 및 message broker 로서 이용되는 오픈 소스입니다.
set, string, hash, list, sorted set 등의 다양한 데이터 구조를 제공합니다.

 

message broker란?

송신자로부터 전달받은 메시지를 수신자로 전달해주는 중간 역할을 수행합니다.

애플리케이션, 시스템, 서비스가 서로 통신하고 정보를 교환할 수 있도록 합니다.

네트워크 지연 문제가 발생해도 시스템이 계속 작동될 수 있도록 보장합니다.

 

 

Redis는 (Remote dictionary server)의 약자로써 외부로부터 dictonary 자료구조(HashMap과 같은 Key-Value)를 사용하는 서버라는 것을 알 수 있습니다.

 

이를 통해 관계형 데이터베이스가 아닌 Key-Value를 데이터 모델로 가지는 NoSQL이구나도 알 수 있습니다.


데이터베이스 엔진 순위

https://db-engines.com/en/ranking

상위 4개의 그룹은 관계형 데이터베이스(RDB)이며 NoSQL 중에서는 MongoDB가 1위, 2위가 Redis입니다.


Redis는 빠른 읽기 및 쓰기 작업, 풍부한 데이터 유형을 제공하고 인메모리 구조로 유명합니다.

데이터를 메모리에 저장하고 용량이 적기 때문에 가장 일반적으로 캐시에 사용됩니다.

 

In-memory 데이터 저장소란?

인메모리란 컴퓨터의 메인 메모리인 RAM에 데이터를 올려서 사용하는 방법을 말합니다.

SSD 또는 HDD 같은 디스크에서 데이터를 가져오는 것보다 RAM에 올려진 데이터를 가져오는데 걸리는 속도가 훨씬 빠릅니다.

 

Local에서 그냥 Java ConcurrentHashMap으로 저장하는 것과 동일한 거 같은데 굳이 In-memory DB를 쓸까요? (Local Cache vs Global Cache)

 

Java concurrentHashMap은 동기화되어있고, Key-Value를 가집니다.

하지만 서버마다 캐시를 따로 저장하기 때문에 다른 서버의 캐시를 참조하기 어렵습니다. ( Local Cache)

이렇게 되면 각 서버에 중복된 데이터를 보관할 수도 있습니다.

따라서 In-memory DB를 사용하면 여러 서버에서 캐시 서버에 접근하여 참조할 수 있습니다. (Global Cache)

또한 In-memory DB가 제공하는 기능들 예를 들면 데이터를 분산해서 저장하는 등을 통해 데이터가 없어지는 경우에 대비할 수도 있습니다.

 

간단하게 Redis를 다음과 같이 정리하고 싶습니다.

Key-Value 데이터 구조를 가지는 NoSQL이며, 인메모리 구조이기 때문에 캐시에 자주 사용됩니다.

 

또한 Redis가 자주 쓰이는 곳들입니다.

- 인증 토큰 등을 저장 (Strings 또는 hash)

- Ranking 보드로 사용( Sorted Set)

 

 

Redis의 데이터 구조

dictonary 자료구조인 key-Value 자료구조 이용하는데 Value로는 다양한 자료구조를 제공합니다.

 

Strings

Redis 문자열에 최대 512MB를 저장할 수 있습니다.

텍스트, 정수, 부동 소수점, 비디오, 이미지 또는 오디오 파일과 같은 모든 유형의 데이터를 저장할 수 있습니다.

redis 127.0.0.1:6379> SET name "educative" 
OK 
redis 127.0.0.1:6379> GET name 
"educative"

여기서 SET, GET은 Redis의 명령어이며, name은 Key, educative는 String Value입니다.

 

List

삽입 순서에 따라 정렬된 문자열 목록으로 머리나 꼬리에 요소를 추가할 수 있습니다.

 

다음은 list연산의 예시입니다.

LPUSH mylist x   # now the list is "x"
LPUSH mylist y   # now the list is "y","x"
RPUSH mylist z   # now the list is "y","x","z" (RPUSH was used this time)

 

Sets

정렬되지 않은 문자열 모음으로 중복 값을 허용하지 않으며 요소는 순서를 가지지 않습니다.

O(1) 시간 복잡도에서 요소를 제거하거나 추가할 수 있습니다.

 

Sorted Sets

각 요소는 점수라고 불리는 숫자와 연결됩니다.

이 점수(숫자)를 통해 순서가 결정됩니다.

 

 

 

Redis의 캐싱 전략

읽기 전략 Look Aside

https://www.youtube.com/watch?v=92NizoBL4uA

가장 일반적인 방법으로 Redis에 먼저 데이터를 탐색하고 데이터가 존재하지 않으면 DB로부터 데이터를 탐색하여 Redis에 넣습니다.

초기에는 Redis에 데이터가 비어있기 때문에 DB의 데이터를 Redis로 밀어 넣어주는 Cache Warming작업을 수행하기도 합니다.

 

쓰기 전략 Write-Around

https://www.youtube.com/watch?v=92NizoBL4uA

Redis에는 저장하지 않고 DB에만 저장합니다.

Redis와 DB의 값이 불일치하는 단점이 있습니다.

 

쓰기 전략 Write-Through

https://www.youtube.com/watch?v=92NizoBL4uA

Redis에 저장하고 DB에 저장합니다.

따라서 쓰이지 않는 값이 저장될 수 도 있습니다.

 

 

사용 시 주의 사항

싱글 스레드 환경이어서 전체 데이터를 가져오는 O(N)의 시간 복잡도 명령어들은 사용할 때 주의해야 합니다.

 

메모리 관리

- 메모리 파편화

- 가상 메모리 Swap

- Replication 

 

 

인메모리 데이터 베이스 비교 ( Redis vs SAP HANA vs Memcached)

인 메모리 데이터베이스

여러 가지 인 메모리 데이터베이스가 있지만 DB 랭킹 엔진의 순위를 기반으로 Redis(6위), SAP HANA(21위), Memcached(32위) 3가지를 비교해보겠습니다.

 

Redis vs SAP HANA vs Memcached

우선 가장 큰 차이점으로써 Redis, Memcached는 Key-Value 형식으로 데이터를 저장하지만 SAP HANA는 RDB 형식으로 데이터를 저장합니다.

 

따라서 셋을 선택할 때는 우선 RDBMS(SAP HANA) vs NOSQL(Redis, Memcached)으로 구분해서 선택해도 좋을 것 같습니다.

 

NoSQL은 복잡하고 지속적으로 변하는 데이터 셋을 가지고 있는 현대의 애플리케이션에 더 나은 옵션을 제공하는 경향이 있으며 데이터 변경을 자주 하지 않는 경우, 확장성이 필요할 때 사용합니다. 

 

RDBMS는 변경될 여지가 없고 명확한 스키마가 사용자와 데이터에게 중요한 경우, 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션에 사용하기 좋습니다.

 

Redis vs Memcached

둘 다 인메모리 데이터베이스이며, Key-Value 형식으로 데이터를 저장하는 공통점이 있습니다.

 

다음은 Memcached와 Redis를 비교하는 AWS 문서입니다.

https://aws.amazon.com/ko/elasticache/redis-vs-memcached/

 

 

Memcached만의 특징

멀티스레드를 지원하기 때문에 멀티 프로세스 코어를 사용할 수 있습니다.

 

Redis만의 특징

싱글 스레드를 제외하면 Memcached보다 더 많이 제공함을 알 수 있습니다.

 

간단하게 정리해보겠습니다.

1. Redis는 Strings 이에 외 추가적으로 다양한 데이터 구조를 제공합니다. ( Memcached는 String만 지원)

2. Snapshots을 통해 특정 시점 데이터를 디스크에 보관할 수 있습니다.

3. 기본 복제본을 여러 개 생성할 수 있어 확장성이 좋고 고가용성 클러스터를 가질 수 있습니다.

4. atomic operation을 지원합니다.

 

출처

https://redis.io/(레디스 공식 홈페이지)

https://zangzangs.tistory.com/72(인메모리 데이터 저장소란?)

https://www.educative.io/blog/what-is-redis(What is Redis?)

https://www.youtube.com/watch?v=mPB2CZiAkKM (우아한 Redis)

https://stackoverflow.com/questions/20376901/using-redis-to-cache-java-objects-why-it-should-be-better-than-a-concurrenthash(concurrentHashMap vs Redis)

https://velog.io/@wnwl1216/%EC%BA%90%EC%8B%9C%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83-%EC%A0%95%EB%A6%AC(캐시의 모든 것 내용 정리 | 토비님유튜브기반)

https://namu.wiki/w/%EC%9D%B8%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4(인 메모리 데이터베이스 | 나무위키)

https://aws.amazon.com/ko/elasticache/redis-vs-memcached/(AWS | Redis vs Memcached)