Redis?
Redis는 Remote dictionary server의 줄일말으로, 외부(Remote)에 key-value값(dictionary)으로 돌아가는 서버를 의미한다.
캐시 시스템으로서 영속성, 다양한 데이터 구조와 같은 부가적인 기능을 지원하는 In-memory database다.
특징
Cache(캐시)
레디스를 알기위해 Cache라는 개념에 대해서 알 필요가 있다. 메모리는 위의 그림처럼 대칭구조로서 위로갈수록 빠르고 비싸고, 아래로 갈수록 느리고 값이 싸다는 특징이 있다.
12MB Cache Memory(SRAM)라는 메모리는 두번째인 Caches 계층에 해당된다.
빠르고 비싸지만 용량이 작다. 그러므로 DB로 쓰기에는 무리가 있다.
16GB DRAM라는 메모리는 Main Memory계층에 해당된다.
이건 적당히 빠르고, 적당히 비싸고, 적당히 크다. 그리고 휘발성(컴퓨터가 꺼지면 사라짐)의 특징을 가지고 있다.
DiskStorage라는 계층에는 SSD, HDD가 존재하는데, 위의 다른 메모리들에 비해서 느리지만, 용량이 크고, 비휘발성(데이터가 남이있음)의 특징을 가지고 있다.
그래서 기술이 발전하면서 Disk Storage에 저장해야만 하는 데이터를 제외하고, 빠르고 덜 바뀌는 데이터들은 "메인메모리에 저장해서 빠르고 쉽게 접근하는게 어떻까?" 해서 나온 개념이 Cahce이고, In-memory database인 Redis가 등장한다.
Data Structor
Redis는 Memcached라는 비슷한 캐시시스템으로서 영속성, 다양한 데이터 구조와 같은 부가기능을 지원한다. Redis만의 차이점은 다양한 자료구조를 제공한다. 위의 그림과 같이 Strings(Java의 Map), List(Java의 Linked List), Sorted Sets(Java의 Tree set)등등의 다양한 자료구조들을 지원하면서 개발 편의성이 좋아지고 난이도가 낮아지는 장점이 있다. 특히 Sorted-Set이라는 자료구조를 사용하면 빠르고 간단하게 데이터를 정렬할 수 있다.
Single Threaded
레디스는 자바스크립트와 동일하게 싱글 스레드의 형태로 작동한다. 즉, 한번에 하나의 테스크씩을 수행하면서 빠른 퍼포먼스를 보여준다. 단순한 get/set의 경우 초당 10만 TPS이상 처리가 가능하다고 설명한다.
하지만 주의할 점으로, 싱글 스레드이므로 시간 복잡도를 고려해야한다. 싱글 스레드 특성상 테스크를 처리하는 과정에서 첫 커맨드가 오래걸리면 나머지들은 뒤에서 대기를 하기때문에 나머지 요청이 받아들여지지 않고 오류가 날 수 있다.
Redis 메모리
위처럼 2019년에 Redis관련해서 쿠팡에서나온 뉴스가 있다.
Redis는 in-memory database이기 때문에 물리적인 용량을 넘어갈 수 없다. 예를들어 키값이 int형으로 되어있다면, 2147483647개의 키값을 넘어가게 된다면 용량부족으로 오류가 날 수도 있다. 그래서 Redis에서는 int에서 long으로 패치를한적도 있다.
Redis 운영시 메모리 관리가 매우 중요하다. 레디스 메모리는 최소크기를 정하고 작게 나누어서 Redis를 운영하는 방법이 효율적이다.
메모리 파편화
메모리를 할당받고 해제하는 과정에서 빈공간이 생기게 된다. 만약 빈공간이 2, 3인데 들어가야 할 메모리가 4보다 크다면 해당 공간을 사용하지 못하는 빈공간으로 남게된다. 이와같은 이유로 실제 사용량보다 더 많은 부분을 사용하게 되는 현상이 생긴다. 큰 메모리 하나를 사용하는 것 보다는 적은 메모리를 사용하는 것이 좋다.
가상메모리 - Swap
실제로 프로세스를 메모리에 올릴때는 전부 다 올리지않고 일부만 올려서 메모리에서 사용하고, 덜 쓰이는 메모리는 디스크에 저장했다가 필요하면 메모리로 올려서 사용한다. 이 과정에서 latency(레이턴시)가 발생하고 Single-Threaded이기 때문에 오류가 발생할 수도 있다. 그러므로 이런 메모리 관련해서 배경지식이 필요하다.
Replication - Fork
캐시는 휘발성 데이터이므로 데이터가 유실될 가능성이 존재한다. 그래서 Replication(복사)기능으로 디스크나 Redis-Server에 저장하는 방식을 선택한다. 이 과정에서 복사에서 Fork라고 프로세스를 복제해서 사용하는 방식을 쓰는데, 메모리가 가득 차있으면 복사가 제대로 안되고 오류가 생길 수도 있다. 이러한 이유로 Fork연산을 사용할 때는 주의해야하며, 메모리는 여유있게 사용하는 것이 좋다.
'Backend > 개념,공부' 카테고리의 다른 글
OOP란 대체 무엇일까?? (1) | 2023.12.31 |
---|---|
Nginx란? (1) | 2023.12.28 |
데이터베이스 - 데이터베이스(DB), MariaDB (0) | 2023.06.18 |