home
Redis는 싱글스레드일까?
정답은 반은 맞다 입니다. Redis의 명령 실행은 싱글스레드이지만, redis 6.0부터는 네트워크 I/O에 있어서는 멀티스레드로 처리합니다.
그렇다면 네트워크 I/O에서는 어떻게 멀티스레드로 처리하는 걸까요?
“네트워크 I/O를 멀티스레드로 처리한다”는 말은, 소켓에서 바이트를 읽고 쓰는 일 일부를 여러 스레드에 분산한다는 뜻이고, 실제 Redis 명령 실행 순서/로직은 여전히 하나의 스레드가 담당한다는 의미입니다.
예를 들어봅시다.
클라이언트 1명이 GET key를 날릴 때 내부적으로는 대략 이렇게 쪼갤 수 있습니다.
- 소켓으로부터 요청 바이트를 읽는다.
- 읽은 바이트를 파싱해서
GET key라는 명령으로 해석한다. - 메모리에서 key를 찾고 value를 가져온다.
- 응답 문자열을 만들고 소켓으로 쓴다.
여기에서 1번과 4번이 네트워크 I/O 입니다. 그리고 3번이 명령 실행이죠.
Redis6 이전에는 이 1~4번이 모두 메인스레드 하나가 순차적으로 실행했으나, 6이후에는 1번과 4번의 일부를 여러 I/O 스레드로 쪼개서 처리할 수 있게 되었습니다.
따라서 Redis6 이후에도 SET, GET, INCR, HSET 같은 실제 명령 로직은 여전히 하나의 메인 스레드에서만 실행되기 때문에 atomic이 보장됩니다. 현실세계에 비교하면 I/O 멀티 스레드는 상하차 담당 물류팀이고, 메인 스레드는 비지니스 로직을 담당하는 팀이 되겠네요.