공부하기/Database
Redis에 대해 정리해보자
다섯자두
2025. 3. 5. 12:10
Redis (Remote Dictionary Server)
▶︎ 인메모리 데이터베이스
인메모리란 말 그대로 컴퓨터의 메인 메모리(RAM)에 데이터를 올려서 사용하는 방법이다.
MySQL, MongoDB 등 disk(SSD, HDD)에 데이터를 저장하는 데이터베이스에 접근하는 것보다 메모리에서 데이터를 가져오는 것이 훨씬 빠르므로 검색 속도 면에서 월등한 성능을 가진다.
▶︎ 다양한 자료구조 지원
기본적으로 Key-Value 구조로 저장한다. 하나의 Key에 Value 데이터를 저장하는 구조이다.
Value에 저장할 수 있는 데이터로 다양한 자료구조를 지원한다.
- String
- List
- Set
- Sorted Set
- Hash
- Stream / Bitmap / Bitfield / Geospatial
▶︎ 싱글 스레드
Redis는 하나의 코어 스레드(싱글 스레드)로 요청을 처리한다.
- Non-blocking I/O 방식을 사용한다.
- 싱글 스레드이기 떄문에 Context Switching 비용이 없다.
- 멀티 스레드 방식에서 발생하는 Lock 이슈가 없다.
- Redis의 대부분의 연산은 O(1) 또는 O(log N)으로 매우 빠르게 실행되어 하나의 스레드로도 효율적으로 요청을 처리할 수 있다.
(+) 최근 Redis 버전(6.0 이상)에서는 멀티 스레드 지원이 추가되어 네트워크 수락 & 응답 처리를 멀티 스레드화 할 수 있게 되었다.
🔽 Non-blocking I/O 방식이란?
입출력 작업을 수행할 때 해당 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속할 수 있는 방식이다.
즉, 입출력 작업이 진행되는 동안 기다리지 않고, CPU가 다른 작업을 수행할 수 있도록 한다.
🔽 Non-blocking I/O 방식 핵심 개념 정리
``이벤트 루프 (Event Loop)``
- 이벤트가 발생하면 적절한 핸들러(콜백)를 실행하는 구조
- Selector(Multiplexing)와 함께 동작하여 여러 개의 이벤트를 감시한다.
- 이벤트를 대기하다가 이벤트가 발생하면 적절한 핸들러(콜백 함수)를 실행한다.
- 하나의 쓰레드가 여러 요청을 관리하면서, 각 요청이 완료될 때마다 적절한 핸들러(이벤트 처리 함수)를 호출하는 방식이다.
``Selector (Multiplexing)``
- 여러 개의 I/O 작업을 하나의 스레드에서 동시에 감시하고 관리하는 방식
- 여러 개의 클라이언트(socket)의 상태를 감시한다.
- 데이터가 준비된(읽거나 쓸 수 있는) 소켓만 선택하여 처리하고 나머지는 무시한다.
- 이벤트 처리가 끝나면 다시 대기 상태로 돌아간다.
- Selector는 소켓의 상태(여러 I/O 이벤트)를 감시하는 역할을 하고,
- 이벤트 루프는 감시되어 선택된 이벤트를 처리하는 역할을 한다.
👀 Redis에서는
1. 클라이언트 요청을 Selector(멀티플렉싱)로 감시한다.
- 여러 클라이언트 요청을 동시에 감시한다.
2. 이벤트 루프가 요청을 처리한다.
- 이벤트가 발생하면 싱글 스레드 이벤트 루프가 적절한 Redis 명령을 실행한다.
Reference
https://dabeen.medium.com/redis-101-6dd36bca2ac