
Redis는 cache, message broker, session store 등 다양한 역할로 사용되는 대표적인 in-memory 데이터베이스다. 디스크 기반 데이터베이스와 달리 메모리를 주 저장소로 사용하기 때문에 매우 빠른 응답 속도를 제공한다. 단순한 Key-Value 저장소를 넘어 문자열, 리스트, 셋, 해시, 정렬된 셋 등 다양한 자료 구조를 제공하며 이 특성 덕분에 대규모 트래픽 환경에서도 널리 사용되고 있다.
Redis 개념과 메모리계층
Redis를 이해하기 위해서는 먼저 메모리 계층 구조를 이해할 필요가 있다. 컴퓨터 시스템의 메모리는 속도와 용량에 따라 여러 계층으로 나뉜다. 가장 빠른 메모리는 CPU 내부에 존재하는 레지스터이며, 그 다음으로 CPU 캐시가 존재한다. 이 두 영역은 속도는 매우 빠르지만 용량이 극히 제한적이다.
일반적으로 우리가 말하는 RAM은 메인 메모리인 DRAM을 의미한다. DRAM은 CPU 캐시보다는 느리지만 충분히 빠르고, 실행 중인 프로그램과 데이터를 저장하기에 적합한 용량을 제공한다. SSD나 HDD와 같은 스토리지는 가장 느리지만 대용량 데이터를 장기 보관하는 역할을 담당한다.
Redis는 이 중 메인 메모리(DRAM)를 기반으로 동작하는 데이터베이스다. 디스크보다 훨씬 빠른 메모리에 데이터를 저장함으로써 반복적으로 접근되는 데이터를 빠르게 제공할 수 있다. 다만 메모리는 용량이 제한적이기 때문에 Redis는 주로 캐시 용도로 사용되며, 자주 접근하고 비교적 덜 변경되는 데이터를 저장하는 데 적합하다.
Redis 개념과 자료구조
Redis가 단순한 캐시 서버를 넘어 강력한 도구로 평가받는 이유는 다양한 자료 구조를 기본적으로 지원하기 때문이다. Redis는 문자열(String)뿐 아니라 리스트(List), 집합(Set), 정렬된 집합(Sorted Set), 해시(Hash)와 같은 자료 구조를 제공한다.
이러한 자료 구조는 서버 단에서 원자적으로 처리된다. Redis는 기본적으로 싱글 스레드 기반으로 동작하며, 모든 명령은 Atomic Critical Section 안에서 처리된다. 따라서 여러 클라이언트가 동시에 접근하더라도 데이터 일관성이 자연스럽게 보장된다.
다만 싱글 스레드 구조이기 때문에 O(n) 복잡도를 가지는 명령어 사용에는 주의가 필요하다. 대규모 데이터에서 잘못된 명령을 사용하면 전체 서버 성능에 영향을 줄 수 있다. Redis를 효율적으로 사용하기 위해서는 자료 구조의 특성과 시간 복잡도를 충분히 이해해야 한다.
Redis 개념과 동작방식
Redis의 내부 동작 흐름은 비교적 단순하지만 매우 효율적으로 설계되어 있다. 클라이언트가 Redis 서버로 명령을 전송하면 이 명령은 패킷 형태로 서버에 도착한다.
도착한 패킷은 입력 버퍼(Process Input Buffer)에 저장된다. 이 버퍼는 명령이 실제로 처리되기 전까지 클라이언트 요청을 임시로 보관하는 역할을 한다. 이후 Redis의 메인 이벤트 루프에서 명령을 하나씩 꺼내어 처리한다.
모든 명령 처리는 단일 스레드에서 순차적으로 이루어진다. 이 구조 덕분에 복잡한 락 처리 없이도 데이터 정합성을 유지할 수 있다. Redis가 높은 성능을 유지할 수 있는 이유는 이 단순한 처리 모델과 메모리 기반 저장 구조에 있다.
Redis 개념과 메모리파편화
Redis는 메모리 기반 데이터베이스이기 때문에 메모리 파편화 문제를 완전히 피할 수는 없다. 메모리 파편화란 메모리 할당과 해제가 반복되면서 연속된 큰 메모리 공간이 부족해지는 현상을 의미한다.
초기 상태에서는 메모리가 연속적으로 할당되어 효율적으로 사용된다. 하지만 데이터가 추가되고 삭제되는 과정이 반복되면 작은 빈 공간들이 메모리 곳곳에 흩어지게 된다. 이 경우 실제 사용 중인 데이터보다 더 많은 메모리를 사용하는 것처럼 보일 수 있다.
Redis에서는 activedefrag 옵션을 통해 자동 메모리 파편화 정리 기능을 제공한다. 또한 데이터 구조를 단순하게 유지하고 불필요한 재할당을 줄이는 방식으로 메모리 파편화를 완화할 수 있다. 운영 환경에서는 메모리 사용량 모니터링이 필수적이다.
Redis 개념과 가상메모리
가상 메모리는 물리적 메모리와 디스크 공간을 결합해 더 큰 메모리 공간처럼 사용하는 기술이다. 일반적인 운영체제에서는 RAM이 부족할 경우 스왑 영역을 활용한다.
스왑은 자주 사용하지 않는 메모리 페이지를 디스크로 이동시키고, 필요할 때 다시 메모리로 불러오는 방식이다. 하지만 Redis와 같은 고성능 인메모리 데이터베이스에서는 스왑이 심각한 성능 저하를 유발할 수 있다.
이 때문에 Redis 최신 버전에서는 전통적인 스왑 기반 가상 메모리를 사용하지 않는다. 대신 LRU(Least Recently Used)와 같은 정책을 활용해 자주 사용되지 않는 키를 제거하는 방식으로 메모리 부족 문제를 해결한다.
Redis 개념과 AOF RDB
Redis는 메모리 기반 데이터베이스이지만 데이터 영속성을 위해 AOF와 RDB 두 가지 방식을 제공한다. AOF는 모든 쓰기 명령을 로그 형태로 기록하는 방식이다.
AOF는 데이터 손실을 최소화할 수 있고 실시간 복구가 가능하다는 장점이 있다. 반면 파일 크기가 커지고 복구 시 모든 명령을 재실행해야 하므로 복구 속도가 느릴 수 있다.
RDB는 특정 시점의 데이터 스냅샷을 저장하는 방식이다. 복구 속도가 빠르고 디스크 부하가 적지만, 스냅샷 사이에 장애가 발생하면 데이터 손실이 발생할 수 있다. 운영 환경에서는 두 방식을 혼합해 사용하는 경우가 많다.