공부하기/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

https://redis.io/docs/latest/develop/data-types/

https://www.youtube.com/watch?v=92NizoBL4uA