본문 바로가기

CS

Redis가 싱글 스레드로 만들어진 이유

Redis가 단일 스레드로 설계된 이유는 주로 성능 최적화, 복잡성 감소, 그리고 데이터 일관성을 유지에 있습니다. 단일 스레드 모델은 멀티스레드 모델에 비해 설계와 구현이 상대적으로 간단합니다. 멀티스레드 환경에서는 동시성 문제(레이스 컨디션, 데드락 등)를 처리하기 위해 복잡한 동기화 메커니즘이 필요하지만,

 

단일 스레드 환경에서는 이런 문제를 자연스럽게 회피할 수 있습니다. 동시에 여러 스레드가 동일한 데이터를 수정하려고 할 때 발생할 수 있는 데이터 불일치 문제를 방지합니다. 모든 명령어가 순차적으로 처리되기 때문에, 복잡한 락(lock) 메커니즘 없이도 데이터의 일관성을 자연스럽게 유지할 수 있습니다.

 

 

Redis는 주로 메모리 내에서 빠르게 수행되는 I/O 작업을 처리하는 인메모리 데이터베이스로 설계되어, 매우 빠른 응답 시간을 제공합니다. 단일 스레드 이벤트 루프를 사용함으로써 컨텍스트 스위칭에 소요되는 오버헤드를 최소화할 수 있습니다.

 

Redis는 이벤트 기반 아키텍처를 채택하여 네트워크 요청을 효율적으로 처리합니다. 단일 스레드 이벤트 루프는 비동기적으로 여러 클라이언트의 요청을 처리할 수 있으며, 이를 통해 높은 동시성을 구현할 수 있습니다. 멀티스레드 모델에서는 이러한 비동기 처리의 이점을 충분히 활용하기 어려울 수 있습니다.

 

즉 정리하자면 Redis가 단일 스레드라는 말은 클라이언트로부터 들어온 명령을 순차적으로 처리한다는 뜻입니다. 즉, 하나의 Redis 인스턴스 내부에서는 동시에 두 개의 명령이 처리되지 않습니다. 이로 인해 Redis 내부 데이터의 동시성 문제는 발생하지 않습니다. 하지만 이건 내부에서만 적용되는 이야기입니다.

 

 


 

Redis 바깥에서의 병렬성


백엔드 API가 Redis에 접근하는 로직을 동시에 실행하면, Redis에 순차적으로 명령을 보내더라도, 백엔드 단의 애플리케이션 로직 내에서 조건 판단과 Redis 명령 간 타이밍 이슈가 발생할 수 있습니다.

 

if redis.get("stock") > 0:
    redis.decr("stock")
 
 

위 로직을 수많은 요청이 동시에 실행하면, 조건 판단 (get)과 감소 (decr) 사이에 타이밍 차이로 중복 감소(overselling) 이 발생할 수 있습니다. 이건 Redis가 단일 스레드라고 해서 막을 수 있는 문제가 아닙니다.

 


 

멀티 노드, 분산 환경


멀티 노드 또는 분산 환경에서는 데이터 일관성 문제가 더욱 빈번하게 발생할 수 있으며, 이를 방지하기 위해 분산락과 같은 동기화 메커니즘이 필수적입니다. 하지만 단일 Redis 노드를 사용하는 경우라고 하더라도, 여러 백엔드 인스턴스에서 동시에 동일한 리소스에 접근하게 되면 여전히 경쟁 상태가 발생할 수 있습니다.

 

특히 재고 감소나 결제 처리처럼 민감한 로직에서는 단일 노드 Redis를 사용하더라도 락이나 원자적 연산을 적용하지 않으면 데이터 불일치 문제가 생길 수 있습니다. 따라서 분산 환경은 물론이고, 단일 노드 환경에서도 동시성 제어는 반드시 고려되어야 합니다.

 

 


 

단일 스레드 이벤트 루프는 수단일 뿐, 안전성은 설계의 몫

Redis는 단일 스레드 이벤트 루프 구조를 통해 성능과 단순성을 극대화하였지만, 이 구조가 모든 동시성 문제를 해결해 주는 것은 아닙니다. Redis는 빠르고 효율적인 도구이지만, 이를 사용하는 애플리케이션의 구조와 동시성 제어 방식에 따라 데이터 무결성과 안정성은 얼마든지 위협받을 수 있습니다.

 

따라서 Redis의 단일 스레드 구조는 이해와 활용의 대상이지, 절대적인 안전장치가 아닙니다. 설계자는 Redis의 동작 특성을 이해한 뒤, 필요한 경우 분산락, 원자 연산, 트랜잭션(Lua), TTL, Pub/Sub 등 다양한 Redis 기능을 적절히 조합하여 신뢰성 있는 시스템을 구성해야 합니다.

 


마무리

 

Redis는 단일 스레드 이벤트 루프 기반으로 동작합니다. 이는 멀티스레드 환경에서 발생할 수 있는 복잡한 동시성 문제를 구조적으로 제거하고, 간단한 설계로도 매우 높은 성능을 낼 수 있기 때문입니다.

 

Redis는 메모리 기반의 인메모리 데이터베이스이며, 이벤트 루프를 활용해 컨텍스트 스위칭 없이도 비동기적으로 수많은 클라이언트 요청을 효율적으로 처리할 수 있습니다.

 

다만, 단일 스레드라고 해서 동시성 문제가 전혀 없다는 의미는 아니며, 애플리케이션 레벨에서는 분산락이나 Lua 스크립트 등의 기능을 활용해 데이터 무결성을 보장해야 합니다. Redis의 단일 스레드 구조는 성능을 위한 수단이지, 동시성 제어의 만능 해결책은 아니라는 점을 이해하고 사용하는 것이 중요합니다.