개발

Redis는 왜 다른 DB보다 빠를까

kwony 2023. 3. 16. 16:20

Redis 는 크게 4가지 측면에서 MySQL 같은 전통 RDB와 차이점이 있다. 

In Memory Storage

다른 데이터베이스는 disk 에다가 데이터를 저장하고 읽는 반면 레디스는 데이터를 메모리에 저장한다. 디스크에 비해 메모리는 입출력 속도가 훨씬 빠르다. 

Data Structure

레디스는 string, hash, list, set, sorted set 으로 작업하기 위해 만들어졌다. 이 데이터 구조는 성능에 효율적이고 레디스가 읽고, 쓰고, 조회하는 것을 빠르게 한다. 그리고 자료 구조를 효율적으로 이용해서 레디스는 메모리 공간을 절약하고 동작에 시간 복잡도를 줄인다. 실제로 레디스는 리스트의 push/pop을 크기와 상관 없이 O(1) 시간에 처리할 수 있다. 그리고 레디스는 교집합이든 합집합도 log(N)의 시간에 처리할 수 있다.

Pipelining

레디스는 파이프라이닝을 지원한다. 하나의 요청에 대해 두개 이상의 커맨드가 들어오는 것을 허용하며 이건 중복된 RTT(Round Trip Time)을 줄일 수 있기 때문에 효율적이다. 그리고 시스템 콜에 소용되는 시간도 줄일 수 있다. 단건의 요청을 처리하는 것은 데이터에 접근하고 답변을 받는 것으로 보면 매우 간단해 보이지만 socket I/O 관점에서도 비용이 많이 드는 일이다. 매번 read/write 의 시스템 콜을 쳐야하는 명령이며 유저와 커널을 반복적으로 왔다갔다 해야하기 때문에 컨텍스트 스위치 패널티가 발생한다. 파이프라인을 이용하면 socket I/O도 한번의 시스템콜을 이용해서 처리할 수 있기 때문에 유리하다. 

Single threaded

redis 는 싱글 쓰레드 이벤트 루프이며 매번 요청을 만들 때 쓰레드를 새로 생성할 필요 없다. 이런 구조는 불필요한 컨텍스트 스위칭과 메모리 사용을 줄일 수 있어 빠르게 응답할 수 있다. 구체적으로 아래와 같은 이점이 있다.

  • 멀티 쓰레드를 관리하는 것과 동기화 이슈가 발생하지 않는점에서 훨씬 관리하기 쉽다.
  • 쓰레드 간의 컨텍스트 스위칭 커뮤니케이션을 제거함으로써 싱글 쓰레드는 더 효율적이고 괜찮은 성능을 발휘한다.
  • 레이스 컨디션이 발생하지 않는다.
  • 싱글 쓰레드 구조는 부하가 강한 상황에서도 레디스가 예측가능하고 일관된 레이턴시를 제공하게 한다. 모든 요청이 순서대로 처리되기 때문에 자원에 대한 경쟁이 없으며 레디스는 낮은 레이턴시 응답을 클라이언트에게 보낼 수 있다.