1. 인메모리 저장소로 랜덤 디스크 i/o가 아닌 메모리단에서 처리하기에 성능이 우수
- 물론 그렇기때문에 휘발성이라는 특성이 존재
2. 단일 스레드로 동작하기 때문에
왜 단일 스레드로 동작하는데 더 빠른가?
여러 스레드를 사용하여 cpu 코어를 활용하는게 더 빠르지 않을까?
다중 스레드의 경우 "락과 동기화 매커니즘"이 필요하다
한 자원에 동시에 접근하여 상태를 변화시킴으로써 기댓값과 결과값이 다른 race condition을 막기 위해 이러한 로직이 추가적으로 필요
단일 스레드의 경우 이러한 과정이 제거된다.
그런데 단일 스레드로 동작하는 하나의 레디스라는 시스템은 어떻게 수천, 수 만개의 요청을 처리해나갈 수 있는가?
레디스의 경우 이벤트루프 방식을 활용
또한 I/O 멀티 플렉싱 방식 활용
즉 한 요청이 들어오면 해당 명령 수행 후 다음 명령 처리가 가능
그런데 I/O 멀티플렉싱의 경우 하나의 통신 채널을 통해 둘 이상의 커넥션으로부터 요청을 받아오는데
이때 get/set의 경우 초당 10만건까지 처리 가능
그러나!!!! 그렇기 때문에 시간이 오래걸리는 명령을 수행하면 망한다.
ex) O(n)의 시간복잡도 명령어
- keys
- delete collections
- get all collections
- flushAll
주의
redis의 경우 명령 실행 자체는 싱글스레드
다만 보다 나은 성능을 위해 등장한게 reading, writing, parsing 영역에서 멀티스레드로 동작하는 i/o thread 방식
- 클라이언트가 전송한 명령을 받는
- 명령어가 처리된 결과를 클라이언트에게 전달하는
정리
1. CPU는 병목현상의 원인이 아님
- 레디스의 병목현상의 대부분은 CPU가 아닌 시스템 메모리/네트워크 대역폭에서 발생
- 즉 스레드를 늘린다고 병목을 개선하는것이 아님
2. concurrency
- redis는 epoll & 이벤트 루프 방식을 채택
- 이벤트루프 패턴을 통해 동시성을 구현하였고 Context-Switch(문맥교환)가 없어 자원을 절약
먼저 레디스가 빠른 이유를 알아보면
왜 단일 스레드로 동작하는데 더 빠른가?
여러 스레드를 사용하여 cpu 코어를 활용하는게 더 빠르지 않을까?
다중 스레드의 경우 "락과 동기화 매커니즘"이 필요하다
한 자원에 동시에 접근하여 상태를 변화시킴으로써 기댓값과 결과값이 다른 race condition을 막기 위해 이러한 로직이 추가적으로 필요
단일 스레드의 경우 이러한 과정이 제거된다.
그런데 단일 스레드로 동작하는 하나의 레디스라는 시스템은 어떻게 수천, 수 만개의 요청을 처리해나갈 수 있는가?
주의
정리