레디스 클라이언트는 레터스를 사용한다고 가정
레디스의 커넥션 풀을 사용한다고 가정
파이프라인을 썼다고 가정 (이건 커넥션 풀에 유무에 따라 초기 커넥션을 얻을때 파이프라인의 행동이 달라서 그렇습니다. 커넥션 풀이 있으면 커넥션 획득 동작은 단일 명령일때와 같습니다.)
1. 스프링데이터레디스는 커넥션풀(아파치 커먼스 풀2)에서 커넥션을 가져와 레터스로 요청을 보낸다.
2. 레터스는 내부적으로 Netty를 호출
3. Netty는 커넥션이 이미 수립되어있으니 기존에 채널이 있을것이다. 그 채널로 레디스에 요청을 보낸다.
4. 레디스는 RESP프로토콜을 쓴다. 역슬래시와 r, n으로 쓰이게 데이터를 직렬화시켜 대역폭과 파싱비용을 최소화하는 프로토콜이다. 네티의 핸들러에는 RESP 인코더 디코더가 있다. 데이터를 RESP에 맞게 직렬화하여 전송한다.
5. 레디스는 C언어로 자체 구현한 이벤트루프를 사용한다. 레디스측의 스레드는 명령시행은 싱글스레드지만 소켓I/O부분은 최근버전에서부터 멀티스레드로 최적화했다고 들었다. 레디스의 이벤트루프가 epoll()에서 일어난 소켓읽이벤트를 수신하여 결과를 꺼낸다.
6. 단일스레드가 명령을 파싱하고 실행 결과를 임시 송신 버퍼에 작성한다. (7번이 시작되도 6번은 계속 진행중이다)
7. 레디스 이벤트루프가 응답해야할 버퍼가 있는지 확인하고 시스템콜을 실행
8. OS커널의 TCP가 그것을 네티로 보낸다.
9. 네티의 이벤트루프가 데이터를 반환할 채널이 있는지 확인한다.
10. 네티는 역직렬화하여 레터스로 보낸다
11. 레터스는 스프링데이터 레디스로 반환한다.
12. 스프링데이터레디스는 파이프라인이 끝날때까지 퓨처로 결과를 모은다. 결과를 모은뒤에 List<Object>로 변환해서 사용자가 받을수있다.
'데이터베이스 > Redis' 카테고리의 다른 글
| 레디스 캐시 전략 (0) | 2025.08.09 |
|---|---|
| 레디스 기본 명령어 (0) | 2025.08.09 |