[Redis] 레디스 간단 설명

bbidag ㅣ 2024. 1. 12. 06:53

반응형

개요

  • RedisRemote dictionary server의 약자로 인메모리 key-value 저장소이다.
  • Cache
    • 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는것

 

컴퓨터 메모리 구조

  1. cpu register
  2. cpu cache
    • 매우 빠르지만 비싸고 적음
  3. main memory
    • 적당히 빠르고, 적당히 비싸고 큼, 휘발성
  4. storage (ssd, hdd)
    • 비교적 느리지만 많이 크고, 비휘발성
  • 기본적으로 데이터베이스는 영구적으로 보관하기 위해 storage를 사용함.
  • 데이터베이스보다 더 빠른 메모리에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자. —> In-memory Database (cache)

 

레디스 데이터 구조

String

  • key-value

List

  • 자바의 linked list

Set

  • 자바의 hash set

sorted set

  • 자바의 tree set

hash

  • 자바의 hashmap
  • object

 

인메모리로 사용한다면 자바 프로세스에서 해당하는 자료구조를 사용할 수도 있는데 굳이 왜 Redis를 사용해야 하는가?

  • 자바 서버가 여러대인 경우 Consistency의 문제 발생
  • Multi-threaded 환경에서 race condition
  • 여러 스레드가 경합해 context switching에 따라 예상하지 않은 값이 발생

 

Redis는 race condition을 구조적으로 해결 가능하다.

  • redis는 기본적으로 single threaded
  • 자료구조는 atomic critical section에 대한 동기화를 제공
  • 서로 다른 transaction read/write를 동기화

 

쓰는 곳

  1. 여러 서버에서 같은 데이터를 공유
  2. single server라면? atomic 자료구조 & Cache

 

주의할 점

  • single thread 서버이므로 시간 복잡도를 고려해야 함
  • in-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요하다.

 

싱글 스레드 모델의 장점

  1. 비동기 이벤트 드리븐
  2. io-bound process
  3. context switching의 효율이 적다
  4. 개발의 단순함

 

redis is single threaded

  • processInputBuffer -> processCommand
  • 패킷으로 하나의 커맨드가 완성되면 프로세스 커맨드에서 실제로 실행됨

 

주의할 점

  • Single thread이므로 빨리 처리해야 한다.
  • O(N) 연산에 대해 주의! ex) keys, getAll, flush

 

메모리 관리

 

 

메모리 파편화

  • 메모리가 할당되고 해제되는 과정에서 유휴 메모리 공간이 파편화되어, 실제로 차지하는 메모리의 양보다 더 큰 메모리 사용량을 갖게 되는것

 

가상메모리 swap

  • 메인 메모리에 모든 프로세스들의 데이터를 다 올릴 수는 없다. 현재 사용하지 않는 메모리는 참조 주소만 가지고
    디스크로 swap out하고, 실제로 사용될 때 swap in 하여, 실제 메모리 크기보다 더 큰 메모리를 가지고 작업을 하는 것처럼 사용하는 기법

 

replication - fork

  • redis는 메모리 데이터베이스이기 때문에 문제가 생겼을 때 데이터가 날라가는 것을 고려해야 한다.
  • 이를 위해서 replication을 한다.
  • 근데 이때 복제된 데이터를 fork해 메모리 공간에 복사해 사용하는데 이 과정에서 메모리가 부족해 제대로 복사되지 않아 서버가 죽는 경우가 있을 수 있다.

 

마지막으로 찾아볼만한 키워드

  1. redis를 저장소처럼 쓸 수 있음
    • Redis Persistent, RDB, AOF
  2. redis는 주기적으로 스케일 아웃, 백업을 해야 함 — redis cluster
  3. 부하 분산을 위해 Consistent Hashing을 사용함
  4. 데이터베이스를 사용하지 않고, 인메모리 DB만 사용하는 Data Grid → Spring Gemfire, Hazelcast가 있음.

참고자료

반응형