DataBase/Redis

Redis 란 (특징, 주의점, 동작 구조)

민돌v 2024. 6. 19. 15:36

💡Redis 묶음

 

 

[목차]

  1. Redis 란
  2. Redis 특징
  3. Redis 사용시 주의사항
  4. Redis 동작 구조

Redis 란 무엇일까

Redis - Remote dictionary server (외부 딕셔너리[key : value] 구조의 서버)
  • Redis 는 Key, Value 의 구조를 가지는 비정형 데이터를 저장하고 관리하는 비 관계형 데이터베이스 관리 시스템(DBMS) 입니다.
  • Redis 는 DataBase, Cache, Message Broker (Pub/Sub)으로 주로 사용됩니다.
  • Redis 는 인 메모리 데이터 구조를 가진 저장소이기 때문에 하드디스크에 데이터를 저장하는 DBMS(Mysql 등등.) 보다 더 빠른 성능을 가집니다.
  • Redis 는 인-메모리 데이터를 사용하기에 높은 데이터 휘발성을 가집니다. 따라서 서버 장애시 데이터 유실이 발생할 수 있기에 그에 대한 운영 플랜을 필요로 합니다.

특징

  1. Remote dictionary server 
    • Key : Value 의 구조
  2. Database, Cache, Message broker
  3. In-memory data Structure Store
    • 메모리 상에 데이터를 저장하는 서버 (Main Memroy - DRAM)
    • Database보다 "더 빠른 Memory"에 더 "자주 접근"하고 "덜 자주 바뀌는"  데이터를 저장하자
  4. Support rich data structure (참고)
    • Strings (key : value)
    • Lists
    • Set
    • Sorted Set
    • Hash
    • Bitmaps, Bitfields (이진 논리와 상태를 저장, 비트맵 키 간에 AND, OR, XOR, NOT 연산 제공)
    • HyperLogLog 
    • Geospatial indexes
    • Streams
  5. Single Threaded
    • Redis 는 기본적으로 Single Thread 구조를 가집니다.
    • Redis 자료구조는 Atomic Critical Section 에 대한 동기화를 제공하기 때문에 Thread Safety 합니다.
    • 서로 다른 Transactinon 의 Read/Write 동기화

Redis 사용 시 주의해야 할 점

1. Redis 는 Single Thread 서버 이므로 시간 복잡도를 반드시 고려해야합니다.

  • 작업 처리의 시간 복잡도가 O(N) 인 자료구조의 사용은 지양해야한다고 합니다.
  • ex) KEYS, Flush, GetAll

Redis 의 커멘드 처리 구조 - Single Thread

2. In-memory 특성상 메모리 단편화, 가상 메모리등의 이해가 필요합니다.

  • 메모리 단편화
    • 메모리 단편화로인해 CPU에서는 실제 사용되는 Memory 총량보다 더 많은 메모리를 잡고있다고 생각할 수 있습니다.
      따라서 Redis 를 사용할때는 보다 여유있게 메모리 공간을 설정해야합니다.
  • Virtual Memory - Swap
    • 가상 메모리를 사용한다면 하드 디스크에서 데이터를 가져올 때의 Context Swtiching 지연시간으로 인해 Single Thread 인 Redis 에 부담이 가해질 수 있습니다.
  • Replication - Fork
    • Redis 는 휘발성을 가지고 있는 메모리상에 데이터를 저장하기 때문에 Replication(데이터 복사) 기능을 제공합니다.
    • 만약 메모리상의 데이터 저장공간이 가득 찼다면 Fork연산 중 Redis server 가 다운 될 수도 있습니다.


Redis 동작 구조

Redis 는 정말 싱글스레드일까?

✔️ 레디스는 Event Loop(이벤트루프)를 이용하여 요청을 수행합니다.

  • 즉, 실제 명령에 대한 작업(Task)는 커널 I/O 레벨에서 Multiplexing(멀티플렉싱)을 통해 처리하여 동시성을 보장합니다.
  • 따라서, 유저 레벨에서는 싱글스레드로 동작하지만, 커널 I/O 레벨에서는 스레드풀을 이용합니다.

→ 즉, 클라이언트로 부터 전송된 네트워크를 읽는 부분과 전송하는 부분은 Multi Thread로 구현되어있으며, 
→ redis에 요청한 
명령을 실행하는 부분은 Single thread로 구현되어 있어 작업의 원자성(Atomic) 보장합니다.

 

Redis 멀티스레드 동작 지원은 v6 이후에 릴리즈 되었다고 합니다.

(좌) Redis v4 (우) Redis v6

 

 

 


참고