Redis 에 대해서

smallcherry's techlog·2023년 7월 24일
0

Redis 개요

  • Remote dictionary server
    • Remote: 외부
    • dictionary: HashMap (key-value)
    • server : 서버
    • 외부에 있는 dictionary 자료구조를 사용하는 서버
  • Database, Cache, Message broker
  • In-memory 데이터 저장 (메모리 상에 데이터를 저장)
    • 다양한 자료구조를 제공함
  • 요약: 메모리상에 HahsMap형태로 데이터를 저장하는 DB

Caching 이란?

  • 캐싱: 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 데이터 접근 방식
  • In-memory cache: 스토리지보다 더 빠른 메모리에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자!
  • (참고) 메모리 계층구조 : 아래로 갈수록 느리고 저렴하고 용량이 크다
    • CPU Register
    • CPU Cache (SRAM)
    • Main Memory (DRAM) - 휘발성 가짐 << redis에서 데이터를 저장하는 계층!
    • Storage (SSD, HDD)

Redis 자료구조

  • In Memory DB 중에서도 Redis의 특장점은 다양한 자료구조를 제공한다는 것!

Redis 자료구조의 종류

  • Redis 자료구조 명 : 대응되는 자바에서의 자료구조
  • String : Map.Entry
  • List: LinkedList
  • Set: HashSet
  • SortedSet: TreeSet (숫자로 순서지정이 가능한 set)
  • Hash : HashMap 혹은 Object

Why Redis?

인메모리 DB 면 결국 아래처럼 코드 상 변수 선언해서 사용하면 되는 거 아닌가?

private final Map<String, Object> inMemoryDB = new HashMap<>();

  • 서버가 여러대인 경우 Consistency의 문제 발생!
    • 세션을 저장한다고 했을 때, A 서버에서 S라는 세션을 저장했다면 B 서버 입장에서는 S라는 세션이 존재하지 않는 것처럼 보임!
  • MutiThreaded 환경에서 Race Condition 문제 발생 가능
    • Race Condition이란?
      • 여러 개의 thread가 한 자원에 접근하며 경합하게 되는 현상
      • Context Swtiching에 따라 원하지 않는 결과가 발생하게 됨
    • Redis는 내부적으로 Race Condition을 방지한다!
      • Redis는 기본적으로 single thread.
      • Redis 자료구조는 Atomic Critical Section (프로세스 여러개가 동시에 접근하면 안되는 영역)에 대한 동기화 제공
      • 서로 다른 Transaction의 Read/Write가 동기화 됨!

Redis 주의사항

Redis, 어디서 쓰나?

  • 여러 서버에서 같은 데이터 공유할 때
  • Single 서버에서도 캐싱을 위해 사용

주의해야 할 점 (Bold = 주의사항)

  • Single Thread 이기 때문에 시간 복잡도를 고려해야 함

    • 전체 데이터를 조회하는 O(N) 의 시간 복잡도가 드는 명령어/메서드 사용을 피하는 것이 좋다. (KEYS, Flush, GetAll)
  • In Memory 특성 상 메모리 파편화, 가상 메모리 등에 대한 이해 필요 (메모리 관리가 중요하다)

    • 메모리 파편화
      용량이 큰 프로세스를 메모리에 할당할 때, 기 종료된 프로세스가 점유하던 메모리의 용량이 새로 할당할 프로세스를 저장할 만큼 크지 않으면, 빨간 화살표 쪽엔 새 프로세스가 할당되지 못한다.
      그러면 검정 화살표 쪽으로 프로세스가 할당되어 프로세스가 실제로 차지하는 공간보다 더 많이 점유되고있다고 컴퓨터가 인식하게 되어, 메모리 공간 효율이 떨어지게 되는 현상을 메모리 파편화라고 한다.

    • 이런 문제 때문에, Redis 사용 시에는 메모리를 여유있게 운용해야 한다.

    • 가상 메모리 swap

      • 가상 메모리 swap이란, 프로세스를 부분으로 나누어 필요한 부분만 메모리에 올려두고 사용하고, 나머지 부분은 스토리지에 두는 기법이다.
      • 싱글 스레드인 Redis 특성 상, swap 과정에서 발생하는 레이턴시가 서비스에 영향을 줄 수 있기 때문에 이러한 부분에 대한 선행지식이 뒷받침되어야 한다.
    • Replication - fork

      • Redis는 휘발성 메모리이기 때문에 휘발될 상황을 대비하여 프로세스 fork로 메모리 상에서 실행중인 프로세스를 복제한 후, disk나 Redis의 slave 서버에 저장하는 기능을 제공함
      • 이러한 fork역시 메모리 상에서 이루어지기 때문에, fork 과정에서 메모리가 초과되면 서버가 죽는 등의 문제가 발생할 수 있다. 따라서 fork기능을 사용할 때도 메모리 용량을 충분히 고려하여 사용하여야 한다.

Reference

profile
Java Developer

0개의 댓글

관련 채용 정보