How does a single threaded codebase handle many thousands of incoming requests and outgoing response at the same time? Won't the thread get blocked waiting for the completion of each request individually?
현대의 CPU 는 다중 코어인데, 왜 싱글 스레드로 동작하는 redis 의 속도가 빠른걸까? 당연히 멀티 스레드로 동작해야 CPU 자원을 효율적으로 쓸 수 있는 것 아닐까?
redis 는 인메모리 DB 여서 I/O 비용이 적습니다. 또한 프로그래밍 자료 구조와 유사한 데이터 타입을 제공해 애플리케이션에서 별도의 처리 없이 이용할 수 있습니다. redis 는 동시성 제어 비용을 줄이기 위해 요청 처리에 single thread 를 사용합니다. 그러나 I/O Multiplexing 기법을 통해 요청이 준비되었는지 여부를 신속하게 체크합니다.
인메모리
디스크 접근은 메모리 접근보다 몇 배의 비용이 더 필요함
redis 에서 데이터는 메모리에 상주함
디스크에 접근하지 않기 때문에 데이터의 처리 성능이 빠름
데이터 셋이 메모리보다 클 수 없다는 제약 있음
자료 구조와 유사한 데이터 타입
redis 는 다양한 자료 구조를 제공하며, 이는 프로그래밍의 기본 자료 구조와 유사함
애플리케이션에서 추가적인 데이터의 가공 없이 사용 가능함
데이터 가공 비용이 없음
부분적 싱글 스레드
멀티 스레드인 경우, 리소스를 I/O 시 락이나 기타 동기화 매커니즘이 필요함
redis 의 요청 처리는 싱글 스레드에서 수행됨 (Event Loop)
단일 redis 는 동기화 비용이 없음
I/O Multiplexing
I/O Multiplexing
여러 클라이언트의 요청을 감시하고, 처리할 준비가 된 요청을 선택하는 과정
요청을 감시하는 작업은 멀티스레딩 환경에서 처리될 수 있음
Event Loop
이벤트 루프는 단일 스레드로 작동함
I/O 멀티플렉싱이 특정 작업이 준비되었음을 알려주면, 이벤트 루프가 그 작업을 처리함
한 번에 하나의 작업만 처리하지만, 빠른 순환으로 여러 작업을 연속적으로 처리하여 비동기성을 제공
Task Queue
이벤트 루프가 Task Queue에 요청을 쌓아둠
단일 큐로 처리 순서가 보장됨
Event Processing
Task Queue 에 요청들을 Event Processor 들이 하나씩 처리하고 클라이언트에 응답