inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2026년! 백엔드 개발자를 위한 Redis 실전 가이드: 기초부터 실무 패턴까지

Redis의 특징: 싱글 스레드의 반전 매력과 영속성

Redis 비동기 I/O 멀티플렉싱이 아니라 논블로킹 I/O 멀티플렉싱이 아닌가요?

26

leegeobuk

작성한 질문수 1

0

안녕하세요 강사님.
"Redis의 특징: 싱글 스레드의 반전 매력과 영속성" 강의에서

[Redis의 속도를 지탱하는 기술: 비동기 I/O 멀티플렉싱] 부분을 보면서 개인적으로 궁금해서 조금 찾아봤습니다.

제가 알아본 바로는 레디스에서는 논블로킹 소켓을 생성하여 epoll(Linux 기준)에 등록 후, epoll_wait을 통해서 준비된 소켓의 fd를 받고 read를 호출하는 것으로 알고 있습니다.

read를 호출하면 커널로 부터 데이터를 복사 받는 것으로 알고 있고, 이 부분을 동기 I/O라고 부르는 것으로 이해했습니다.

이것이 만약에 비동기 I/O가 될려면, read 호출이 아닌 커널에게 "커널 버퍼의 데이터를 읽어서 프로그램 메모리로 복사해줘"라고 요청만 한 후에 작업이 완료되면 커널이 알려주어야 하는데, 레디스는 이 방식을 사용하지 않는 것으로 알고 있습니다.

그래서 저는 레디스가 논블로킹 소켓 + 동기 I/O + I/O 멀티플렉싱이라고 이해를 했는데요, 이것을 비동기 I/O 멀티플렉싱이라고 표현하는게 맞는지 궁금해서 문의드립니다.
아니면 혹시 강의 초반 부분여서 편의상 비동기 I/O 멀티플렉싱 정도로만 표현하고 넘어가신걸까요?

강의 재밌게 잘 보고 있습니다.
좋은 강의 만들어주셔서 감사합니다!

redis

답변 2

0

코딩하는기술사

안녕하세요! 좋은 질문 감사합니다.
말씀하신 내용이 정확합니다.


말씀해 주신 것처럼 Redis는 논블로킹 소켓과 epoll(Linux 기준)을 활용하여 여러 소켓의 I/O 준비 상태를 확인하고 실제 데이터 읽기는 read() 계열 함수를 호출하는 방식으로 처리합니다.

따라서 운영체제의 I/O 모델을 엄밀하게 구분한다면, Redis는 논블로킹 I/O + I/O 멀티플렉싱을 사용하는 동기 I/O 모델이라고 설명하는 것이 더 정확합니다.


강의에서 '비동기 I/O 멀티플렉싱'이라고 표현한 것은 Redis가 특정 클라이언트의 네트워크 I/O를 기다리느라 멈춰 있지 않고 이벤트 루프를 통해 여러 클라이언트의 요청을 효율적으로 처리한다는 점을 쉽게 설명하기 위해 조금 포괄적으로 사용한 표현이었습니다.


다만 말씀하신 것처럼 기술적으로 엄밀하게는 '논블로킹 I/O와 I/O 멀티플렉싱' 이라고 표현하는 것이 맞습니다.


참고로 이 부분에 대한 상세한 내용은 제 유튜브 채널의 Redis 영상에서도 다루고 있습니다.


아래 영상의 7분 20초 부분에서 Redis의 I/O 멀티플렉싱 동작 원리를 설명하고 있으니 함께 참고하시면 좋을 것 같습니다.

https://youtu.be/H-jSrhvnaLY?si=-oMBYx85fB8lTt4M


좋은 질문과 꼼꼼한 피드백 감사드립니다.
앞으로도 궁금한 점이 있다면 언제든 질문해 주세요!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

leegeobuk님, 이해하신 내용이 정확합니다.

Redis의 네트워크 처리는 엄밀히 말하면 다음과 같이 표현하는 것이 더 정확합니다.

논블로킹 소켓
+ I/O 멀티플렉싱(epoll, kqueue 등)
+ 준비된 소켓에 대한 read/write 호출

epoll_wait()는 데이터 자체를 애플리케이션 메모리로 복사해 주는 것이 아니라, “읽을 데이터가 준비된 파일 디스크립터가 무엇인지”를 알려주는 역할을 합니다.

그 이후 Redis가 read()를 호출하면 커널 버퍼의 데이터가 사용자 공간 버퍼로 복사됩니다.

따라서 epoll 기반 방식은 데이터 복사가 완료된 뒤 알림을 받는 완료 기반 비동기 I/O라기보다는, I/O 작업을 수행할 수 있는 상태가 되었을 때 알림을 받는 준비 상태 기반 방식입니다.

엄밀히 구분하면 다음과 같습니다.

논블로킹 I/O:
read()나 write()가 데이터 준비를 기다리며 오래 블로킹되지 않음

I/O 멀티플렉싱:
하나의 스레드가 여러 소켓을 epoll_wait() 등으로 감시함

비동기 I/O:
커널에 I/O 작업을 요청하고, 작업 완료 시점에 완료 통지를 받음

그러므로 Redis의 epoll 방식은 기술적으로는 “논블로킹 소켓을 이용한 I/O 멀티플렉싱” 또는 “이벤트 기반 논블로킹 I/O”라고 표현하는 것이 가장 정확합니다.

강의에서 표현한 “비동기 I/O 멀티플렉싱”은 넓은 의미에서 애플리케이션이 I/O 완료를 기다리면서 스레드를 블로킹하지 않는다는 의미로 사용한 표현일 수 있습니다.

다만 Linux의 전통적인 epoll 모델과 POSIX 비동기 I/O 또는 io_uring 같은 완료 기반 비동기 I/O를 엄밀하게 구분한다면, leegeobuk님이 말씀하신 것처럼 Redis의 방식은 “비동기 I/O”보다는 “논블로킹 I/O 멀티플렉싱”이라고 부르는 편이 더 적절합니다.

정리하면 다음과 같습니다.

Redis:
논블로킹 소켓 + epoll 기반 I/O 멀티플렉싱
강의 표현:
비동기적으로 여러 연결을 처리한다는 넓은 의미의 표현

따라서 질문하신 것처럼 초반 강의에서 개념을 직관적으로 전달하기 위해 편의상 표현한 것으로 이해하시면 됩니다.

참고로 Spring Boot에서도 Redis 클라이언트로 Lettuce와 Jedis를 사용할 수 있으며, Spring Boot는 기본적으로 Lettuce를 사용합니다.

출처: Spring Boot Redis 공식 문서

강의 관련 질문드립니다.

1

41

2

Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)

1

35

1

미션 제출 방식 건의

0

36

0

트랜잭션 내 Redis I/O 에 대한 궁금한점

1

37

1

미션 진행 방식에 대한 질문입니다.

0

54

1

파킹 페이지와 대기열 큐 질문입니다.

0

49

1

최근 N개 데이터 표현 시 중복 질문

0

56

1

pub/sub의 연결 객체에 대해 질문 드립니다.

0

79

2

인기 게시판 목록(Sorted set)

0

104

2

레디스로 재고 관리

0

122

2

Lock 해제 문의 드립니다.

0

113

2

레디스로 대기큐 구현 질문

0

147

2

API LIMIT

0

91

1

캐시 무효화

0

96

2

Redis와 Kafca의 Pub/Sub 차이

0

143

2

너무 흥미진진합니다..

1

109

2

순위가 동률일 때의 처리에 대해 질문드립니다.

0

154

2

Redlock 알고리즘 관해 궁금한게 있습니다!

0

144

2

좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.

0

119

2

백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제

0

174

1

강사님 GETDEL 관련해서 질문 있습니다

0

176

2

비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우

0

184

2

보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요

0

120

2

Redis Container 해킹

0

166

1