Redis는 데이터 저장소로 디스크가 아닌 메모리를 사용하는 In-Memory DB이다.
그렇다면 먼저 In-Memory DB가 무엇인지 알아보자.
In-Memory DB는 말 그대로 데이터를 디스크가 아닌 메모리에 저장하는 데이터베이스이다. 메모리와 디스크 사이의 병목이 없기 때문에 디스크에 저장하는 Disk-based DB보다 속도가 훨씬 빠르다는 장점이 있다.
외부 저장장치인 디스크에 데이터를 저장했다고 가정하자. 이 데이터를 먼저 읽어와서 메모리에 올리고, 그 다음에 메모리에 올라간 데이터를 읽어야 이 데이터를 사용할 수 있게 된다.
또한 Disk-based에서는 기본적으로 데이터를 페이지 단위로 읽어오게 된다. 만약 내가 원하는 데이터가 2번 페이지에 있는데, 1번 페이지를 읽어왔다면 1번에는 원하는 데이터가 없기 때문에 다시 한번 2번 페이지 읽기를 시도하게 된다. 이 과정에서 지연이 발생하기 때문에 느려지게 된다.
In-Memory DB의 단점에 대해 생각해보자. 여기서 말하는 메모리는 기본적으로 RAM을 의미한다. RAM은 휘발성 메모리이기 때문에, 기본적으로 영속성을 보장하지 않는다.
또한 RAM은 공간이 한정되어 있다. 예를 들어 8GB라고 가정해보자. 8GB라는 저장 공간이 한정되어 있기 때문에, 대용량의 데이터를 저장할 수 없다는 단점이 있다. 또한 대용량의 데이터가 한번에 들어올 경우 메모리 스왑이 일어나며, 기존 성능보다 느려지는 현상을 보이기도 한다.
In-Memory DB의 대표적인 예로 Redis가 있다. Redis는 기본적으로 In-Memory DB의 속성을 따른다.
Redis는 모든 데이터를 메모리에 저장하고 조회하기 때문에 다른 Disk-based DB보다 매우 빠른 성능을 보인다.
가장 큰 차별점은 다양한 자료구조를 지원한다는 점이다. String
, Bitmaps
, Hashes
, Lists
, Sets
, Sorted-Set
등등.. 다양한 자료구조를 지원함으로써 개발 편의성이 좋아지고 진입 난이도가 낮아지게 된다.
예를 들어, 어떤 데이터를 정렬하고 읽어오려고 한다면 Disk-based DB의 경우 DB에 데이터를 저장하고, 저장된 데이터를 정렬하고 다시 읽어오는 과정에서 디스크에 직접 접근을 하기 때문에, 위에서 설명했던 이유와 같이 성능이 느려지게 된다.
이때 Redis에서 제공하는 Sorted-Set
이라는 자료구조를 이용하면, 위와 같은 과정 없이도 더 빠르고 간단하게 데이터를 정렬할 수 있다.
일반적으로는 그렇다. 그러나 레디스는 데이터 영속성을 보장하기 위해서, 데이터를 디스크에 저장하는 방법을 제공한다. 서버가 내려가더라도 디스크에 저장된 정보를 읽어와서 메모리에 로딩을 한다. 이 방법으로는 두 가지 방식이 있다.
Redis가 어떤 기능을 하는지 공부하기 전에는 In-Memory DB이기 때문에 데이터 영속성을 지킬 수 없어서 적절하지 않다고 생각했다.
그러나 위에서 소개한 내용에 따르면, Redis는 일반적인 In-Memory DB와는 다르게 영속성을 보장하기 위한 방법을 제공하고 있다.
그렇다면 Redis가 메인 DB의 역할을 하기에 부적절한 이유는 무엇일까?
이미 위에서 설명했던 내용들에 그 이유가 있다. In-Memory DB의 저장 용량은 기본적으로 RAM의 저장 공간을 따르게 된다. 그렇기 때문에 메인 DB의 역할을 하기에는 부족한 저장 공간을 가지고 있는 것이다.
또한 대용량의 데이터가 한번에 들어올 경우, 메모리 공간의 부족 때문에 메모리 스왑이 일어나게 되는데 이 경우 성능의 저하가 발생하게 된다.
현실적인 이유에서는 고성능인 만큼, 고비용이 따른다는 단점이 있다.
그리고 마지막으로 디스크에 데이터를 저장하여 영속성을 유지하는 방법을 사용하는데, 이 경우 사실상 Disk-based DB를 사용하는 것과 다름이 없기 때문에 굳이 비싼 비용을 지불하며 Redis를 사용하는 메리트가 없기 때문이다.
이러한 이유 때문에 메인 DB보다는 다른 메인 DB의 데이터를 캐시시키는 목적으로 사용되는것이 일반적이다.