다오의 개발일지

TIL-32 Redis에 대한 학습 본문

WTIL

TIL-32 Redis에 대한 학습

다오__ 2023. 8. 28. 19:58

Remote dictionary server

외부 키-벨류형태의 자료구조 서버

 

레디스의 특징

Remote dictionary server

Database, Cache, Message broker

In-memory Data Structure Store

Supports rich data structure

 

Cache?

나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것

CPU Cache (SRAM) : 용량이 너무 적어 데이터베이스로 사용하기에는 어렵다.

Main Memory (DRAM) : 휘발성, 적당한 메모리 적당한 속도

Storage (SSD, HDD) : 비휘발성, 적당히 느림. 많은 메모리

 

기본적으로 데이터를 SSD, HDD에 저장하지만 기술이 발달함에 따라 메인 메모리에 저장해 쉽고 빠르게 접근하면 어떨까라는 개념으로 나오게 된게 레디스이다.

 

즉 DB보다 더 빠른 Memory에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자 = In-memory Database (Cache)

 

레디스의 자료구조

Collection

레디스와 가장 비교되는 자료구조로는 멤캐시드라는 인메모리데이터베이스가 있는데 차이점이

이러한 컬렉션 자료구조를 제공한다는 점이다.

String : 자바의 Map.Entry

List : LinkedList

Set : HashSet

Sorted Set : TreeSet, score라는 숫자값으로 순서를 정할 수 있다.

 

자바로 데이터 저장을 해도 결국 메모리에 저장하는 것인데 왜 사용을 하지 않을까?

1. 서버가 여러대인 경우 Consistency의 문제 발생

2. Multi-Threaded 환경에서 Race Condition

 

Race Condition?

여러개의 Thread가 경합하는 것, Context Switching에 따라 원하지 않는 결과가 발생한다.

 

RaceCondition 해결

Redis는 기본적으로 Single Threaded

Redis 자료구조는 Atomic Critical Section에 대한 동기화를 제공

서로 다른 Transaction Read/Write를 동기화

 

Critical Section?

동시에 프로세스가 접근하면 안되는 영역

 

어디서 쓰는지?

여러 서버에서 같은 데이터를 공유할 때

SingleServer라도  Atomic 자료구조 & Catch의 이점이 있다.

 

싱글 쓰레드이기 때문에 생기는 단점

 

In-memory 특성상 메모리 파편화, 가상 메모리등의 이해가 필요하다.

 

명령어가 오랜 시간이 걸리는 경우 나머지 요청들이 받아지지 않고 서버가 다운되는 경우가 있다.

따라서 빠르게 처리하기 위해 시간복잡도를 항상 고려해야한다. O(N) => 주의해서 사용(KEYS, Fluch,  GetAll)

 

메모리 관리

1. 메모리 파편화

메모리를 할당받고 해제하는 과정에서 빈 공간이 생기게 된다.

4번의 사진같은 긴 메모리를 할당받으려면 피지컬메모리에서 사용하지 못하는 부분이 생기게 된다.

이러한 문제 때문에 더 많은 메모리를 낭비되고 프로세스가 죽는 문제가 생길 수 있다.

따라서 Redis를 사용할 때에는 메모리를 항상 여유있게 사용해야한다.

 

2. 가상메모리 Swap

프로세스를 메모리에 올릴 때 일부만 올려 메모리에 사용하고, 덜 쓰이는 메모리는 디스크에 저장했다가 필요할 때 메모리에 올려서 사용하는 것을 채택하고 있다. 이 때 지연시간이 발생하게 되고, 싱글쓰레드환경이기 때문에

스왑에 대한 사용여부에 있어 지식이 필요하다.

 

 

3. Replication - Fork

레디스는 휘발성을 가진 메모리 데이터저장소이기 때문에 유실될 위험을 가지고 있따.

따라서 데이터를 복사해서 레디스 서버나 디스크등에 전송해서 저장하는 방식을 채택한다.

이 과정에서 메모리가 가득차있다면 복사본이 생성되지않고 서버가 죽는 현상이 발생할 수 있따.

즉 메모리를 여유있게 관리하는 것이 중요하다.

 

추가적으로 확인해보면 좋을 것

Redis Persistent, RDB, AOF

Redis 메모리는 제한되어있기 때문에 주기적으로 Scale out, Back up을 해야함 -> Redis Cluster

부하 분산 -> Constant Hashing

Data Grid -> Spring Gemfire, Hazlecast

 

출처 : 우아한 테크코스 디디의 Redis

https://www.youtube.com/watch?v=Gimv7hroM8A