회사에서 Redis를 사용해 보았다.
주로 key에 대한 실시간 데이터 저장의 용도로만 Redis를 사용하였다.
이에 Redis를 왜 사용하는지, Redis에서 제공하는 기능에는 어떤 것들이 있는지, Redis와 유사한 툴에는 무엇이 있는지 찾아보고 정리하고자 한다.
먼저 Redis를 간단하게 3가지 키워드로 정의해보자.
Reids의 소개글에서 굵직한 키워드들을 살펴보면,
- Data structure store
- Atomic operations
- In-memory dataset
이렇게 3가지 키워드로 정리해 볼 수 있을 것 같다. 하나하나 톺아보도록 하자.
.
데이터 구조를 저장하기 위한 저장소라는 건데, 그렇다면 데이터 구조가 무엇인지 알아보자.
데이터 구조는 데이터를 구성, 처리, 검색 및 저장하기 위한 특수 형식으로 정의할 수 있다.
개발자가 개발을 함에 있어 다양한 Object Type을 사용하는데, 이들이 바로 데이터 구조의 하위 개념이다.
그렇다면 데이터 구조 저장소는 이러한 데이터들을 저장하고, 원할때마다 다시 확인할 수 있는 공간 정도로 이해할 수 있을 것이다.
.
직역하면 원자적 작업을 의미한다. 여기서 원자의 의미는 여러 곳에서 동시에 하나의 자원에 접근하더라도 각기 서로 다른 자원을 사용하는 일이 발생하지 않는다는 의미이다. 예를 들어 java에서는 AtomicBoolean과 같은 객체가 Multi Thread 환경에서 동기화 문제를 해결하기 위해 원자성을 보장해준다. 그렇다면 Redis는 어떻게 원자적 작업을 지원한다는 의미인가.
Redis는 특이하게 Single Thread 환경으로 동작한다. 하나의 Thread로만 실행되기에 여러 곳에서 동시에 자원을 요청해도 하나의 Thread가 순차적으로 그 작업을 처리하므로 원자성이 보장된다. 아래 나열된 명령어들은 이 특징과 연관된 예시이다.
어떻게 보면 Multi Thread 환경이 더 CPU 자원을 사용해서 빠를 것 처럼 여겨지지만, 실제로 Lock, Syncronize 메커니즘이 있기에 특정 상황에서 Single Thread 보다 더 느리게 동작할 수도 있다. (또한 Multi Thread는 그 구현의 복잡성으로 버그가 발생할 가능성이 높다.)
참고로 하나의 서버에서 Redis를 실행할때 더 많은 CPU를 사용하기 위한 방법으로는 여러 Redis 인스턴스를 실행하는 방법이 있다.
Single Thread의 가장 기본적인 단점은 이전의 작업이 끝나야만 다음 작업을 수행할 수 있다. Redis가 Single Thread 환경에서 IO(Inpu) Multiplex를 사용한다. 이는 하나의 Thread가 다중 IO를 관리한다는 개념인데, 여기선 그 개념을 정리하기 쉽지 않아 링크로 남긴다.
.
Memory 구조를 살펴보면 CPU Register > L1 Cache > L2 Cache > L3 Cache > RAM > SSD > HDD 순의 접근 속도를 지니는데, 이 중에 Redis가 사용하는 계층이 RAM이다.
가장 기본적인 장점으로는 상대적으로 느린 Disk에 대한 IO가 발생하지 않기 때문에 속도가 빠르다. 그리고 효율적인 공간 관리가 필요한 데이터 구조들(Linked List, Hash Table)에 대해 더 단순하고 효율적으로 사용할 수 있다.
Redis와 가장 많이 비교되는 In-memory dataset으로는 Memcached가 있다. 이 둘의 가장 큰 차이점은 Thread가 Single인지 multi인지에 있다.
최근 들어서는 Key DB, Dragonfly, Skytable 등 다양한 기술들도 등장했다. 이는 별도의 섹션에서 정리하기로 한다.
.
.
.
이렇게 Redis의 기본적인 개념을 정리해보았다. 다음 시간에는 Redis의 데이터 타입, 기본 사용법들을 정리해보기로 한다.
(참고 자료)