프로젝트/프로젝트 관련

Redis란 무엇인가?

Wonuk 2021. 12. 1. 17:50
반응형
본 포스팅은 하단의 링크(우아한 테크코스 디디의 Redis)
영상을 기반으로 제작 되었습니다.
https://www.youtube.com/watch?v=Gimv7hroM8A

Redis(Remote dictionry server)

Remote = 외부

dictionry = 해시맵 (key, value)

server= server

 

외부에 있는 dictionary라는 자료구조를 사용하는 서버입니다.


예전 모 이커머스 사이트에서 모든 상품이 품절로 표시되는 장애가 발생했습니다.

그 원인으로는 Redis DB 때문이라고 밝혀졌습니다.

 

자세한 설명을 하기에 앞서 이해를 위해 설명하자면

32bit CPU에서 Int의 최대값은 2147483647 즉 21억 가량입니다.

 

즉 key 값이 너무 많아졌기 때문에 (21억을 초과) 장애가 발생했다고 합니다.

 

때문에 실제로 Redis는 int -> long 타입으로 패치가 되었습니다.

 


그래서 Redis는 무엇인가?

Supports rich data structure 다양한 자료구조를 제공한다.
In-memory Data Structure Store 인메모리 데이터 저장소이다.

cache 캐시

 

Cache란?

간단하게 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는것 입니다.
그렇다면 어디에 저장하는것이 가장 빠른가?

 

Memory 계층구조

 

기본적으로 계층구조는 위로 갈수록 빠르고 작고 비싸고
아래로 갈수록 느리고 큰 저렴한 저장소입니다.

 

예시)맥북 사양 i7 CPU - 12MB Cache Memory 16GB DRAM 512GB SSD

 

12MB Cache Memory(SRAM) 빠름 비쌈 용량작음 -> DB로 사용하기엔 너무작다.

 

Main Memory (DRAM) 16GB DRAM -> 적당히 빠름, 적당히 비쌈, 적당히 큼, 휘발성 메모리

(컴퓨터 종료시 데이터가 날아감)

 

Storage(SSD, HDD) 512GB SSD -> 비교적 느림, 비교적 저렴함 엄청 큼, 비휘발성

 


Redis가 나오게된 배경

기본적으로 DB는 데이터를 컴퓨터가 꺼져도 저장이 되야해서 SSD에 저장이되는데
기술이 발전하고 하드웨어들이 커지다보니 MainMemory에 저장하고 빠르게 접근하면 어떨까라는

개념으로 나온것이 Redis입니다.

 

즉, DataBase보다 더 빠르게 Memory에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자.

라는 개념으로 나온것이 In-memory Database(Cache) Redis 입니다.

 


MemCached

Redis와 비교되는 MemCached라는 인메모리 DB가 있는데 Redis와

가장 큰차이점은 컬렉션 자료구조를 사용하고 있다는 점입니다.

 

간단하게 설명하자면

String  -> 자바의 Map Entry 자료구조 key-value

 

List -> 자바의 LinkedList 자료구조 key-List

 

Set -> 자바의 HashSet 자료구조 key-set

 

Sorted Set -> 자바의 TreeSet 자료구조 key-set score라는 숫자값으로 순서정함

 

Hash -> 자바의 HashMap or Object 자료구조 key-Hash 쌍

 


JAVA - Redis

private final Map<String, Object> 나는왜 안쓰는데 ㅠㅠ = new HashMap<>();

 

1. 서버가 여러대인 경우서버마다 다른 데이터를 갖고있기 때문에 Consistency 문제발생(일관성)

ex) 세션을 자바객체로 저장한다면 다른서버에서는 해당세션이 없기때문에 문제가 발생함

 

2. Multi-Threaded 환경에서 Race Condition 문제가 발생함.
Race Condition이란 여러개의 Thread가 경합하는것

주기적으로 발생하다보면 Context Switching에 따라 원하지 않는 결과가 발생

 

그래서 Redis는 기본적으로 Single Threaded 사용
Redis 자료구조는 Atomic Critical Section에 대한 동기화를 제공 (Atomic한 성질을 가지고있어서)
Critical Section -> 동시에 프로세스가 여러개가 접근하면 안되는 영역
서로 다른 Transaction들이 Read/Write를 동기화하며 원치않는 결과를 막아줌

 


Redis 사용처

여러 서버에서 같은 데이터를 공유할때 ex) 세션
Single Server라면 ? Atomic 자료구조 & Cache 기능 사용

 


Redis 사용시 주의해야할점

Single Thread 서버 이므로 시간 복잡도를 고려해야 한다.
In-memory 특성상 메모리 파편화, 가상 메모리등의 이해가 필요하다. (OS, Memory) 지식

 

아래 메모리관리, O(N) 명령어 지양 참조


왜 Redis는 Single Threaded 일까

Event Driven (비동기)
IO-bound Process 
Context Switching의 효율이 적다

 

IO-bound Process 

-> CPU 연산보다 메모리 IO관련된 시간이 많이 소요되는데 CPU를 optimization(최적화)했을 떄 효율이 크지않다.

 

-> Simple함을 위해 싱글 스레드를 사용하는 이유도 있다.

 


Redis 사용시O(N) 관련 명령어는 지양

커맨드가 오랜 시간이 걸리는 경우 나머지 요청들이 더이상 받아지지 않고 서버가 다운되는 문제가 발생할 수 있다.
Sigle Thread이므로 빨리빨리 처리해야 한다. 그만큼 처리가 빨라야한다. -> 

KEYS, Flush, GetAll 연산주의 O(N)

 


메모리 관리

메모리 파편화

메모리를 할당받고 해제하는 과정에서 부분부분 비어있는 공간이 생기게된다(생성 되었다가 해당 부분만 해제)
때문에 새로생긴 4번같은 커다란 프로세스를 할당하려면 검은색 화살표 부분만 할당 가능합니다.
그래서 메모리 낭비가 발생하고 컴퓨터는 실제 용량보다 많다고 인식하기 때문에

이러한 과정에서 프로세스가 죽는 현상이 발생할 수 있습니다.
그래서 Redis를 사용할 때는 메모리를 적당히 여유있게 사용하여야 합니다.

 

 

가상메모리

실제로 프로세스를 메모리에 올릴때 일부만 올려서 메모리에서 사용하고 

덜 쓰이는 프로세스의 메모리들은 디스크에 저장했다가
필요할 때 메모리에 올려서 사용하는 방식을 사용하는데 

이 과정에서 레이턴시가 발생하게되고 이 레이턴시가 길어지게 된다면
싱글스레드 환경이기 때문에 문제가 발생할 가능성이 있습니다.

 

레이턴시(latency)는 자극과 반응 사이의 시간이며, 더 일반적인 관점에서는 관찰되는
시스템에서의 어떠한 물리적 변화에 대한 원인과 결과 간의 지연 시간이다. 
레이턴시는 물리적 상호작용이 추진할 수 있는, 물리적으로 제한된 속도의 결과라고 할 수 있다.

 

 

Redis는 휘발성을 가지고있는 메모리상의 데이터 저장소이기 떄문에 항상 유실될 문제를 안고 있습니다.
그래서 데이터 복사 기능을 제공하는데 데이터를 복사해서 Slave용 레디스 서버 혹은 디스크로 전송해서

저장하는 방식을 선택합니다. Master, Slave DB구조


하지만 이 복사하는 과정에서 Fork(프로세스를 동일하게 복제해서 메모리상에서 사용하는 방식)을 사용하는데 

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

때문에 Redis 사용 시 반드시 메모리를 여유있게 사용하여야 합니다.

 


추가로 공부하면 좋을내용

 

참고링크 우아한 테크코스 -> 

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

 

 

반응형