[Redis] Redis가 뭘까??

nano·2024년 12월 4일

개념정리

목록 보기
1/2


OAuth를 진행하면서 토큰을 저장해야하는 경우가 생겼는데, 토큰을 생성하고 관리해줄곳을 생각하다보니 하나같이 전부 Redis를 이용해서 토큰을 관리한다고 한다. 그럼 여기서 Redis가 뭘까???


✏️ Redis란?

  • Remote DIctionary Service
  • 고성능 Key-Value 구조의 저장소
  • 비정형 데이터를 저장, 관리하기 위한 오픈소스 기반의 NoSQL

데이터를 저장하는 방법에는 대표적으로 두가지의 방법이 있는데

  • 첫번째는 Disk-Based DB 즉, 메모리를 디스크에 저장하는것이다
    예를 들면 흔히들 사용하는 MySQL이 여기에 해당한다.

  • 두번째는 In-memory DB 즉, 데이터를 메모리에 저장하는 것이다.
    여기서 메모리는 RAM 혹은 cache를 뜻한다.

그럼 왜 데이터베이스에 저장 안하고 메모리에다가 데이터를 저장할까??

디스크는 물리적요소를 직접 사용하기 때문에, 사용자가 많아질수록 부하가 많아져서 느려진다. 이 경우에는 비용적인 면에서 큰 손실로 이루어지기때문에 이때 캐시 서버를 직접 도입해서 사용을 하는데, 여기서 사용할 수 있는게 Redis이다.

캐시는 한번 읽어온 데이터를 임의의 공간에 저장하여 같은 요청이 여러 번 들어오는 경우 매번 데이터 베이스를 거치는 것이 아니라 캐시 서버에서 저장된 결괏값을 바로 내려주기 때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점이 있다.


✔️캐시서버 패턴의 종류

  • 캐시서버는 Lock aside cache 패턴과 Write Back 패턴이 존재한다.
    • Lock aside cache
      • 클라이언트가 데이터를 요청
      • 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
      • Cache 서버에 데이터가 있으면 DB에 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게 바로 반환
      • Cache 서버에 데이터가 없으면 DB에 데이터를 조회하며 Cache 서버에 저장하고 결과값을 클라이언트에게 반환
    • Write Back
      • 웹서버는 모든 데이터를 Cache 서버에 저장
      • Cache 서버에 특정 시간동안 데이터가 저장됨
      • Cache 서버에 있는 데이터를 DB에 저장
      • DB에 저장된 Cache 서버의 데이터를 삭제
      • insert 쿼리를 한번씩 500번 날리는것보다 쿼리 500개를 붙여서 한번에 날리는 것이 더 효율적이라는 원리이다. 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무르는데 이때 서버에 장애가 발생한다면 데이터가 손실될 수 있다.

✔️Redis의 특징

  • Key, Value 구조로써 쿼리문을 따로 작성할 필요가 없다.
  • 디스크가 아닌 메모리에서 지원하기때문에 데이터 처리 속도가 빠르다.
  • 다양한 데이터타입을 지원한다.

-> 이러한 이유들을 통해서 개발의 편의성을 높이고 값을 관리하기가 쉬워진다.

  • 싱글 스레드이다.
    -> 한번에 하나의 명령만 수행하기때문에 Race Condition이 발생하지 않는다.

    ✔️ Race condition
    공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태
    즉, 두개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황에서 발생
    프로그램의 일관성과 정확성을 손상시킬 수 있음

    Ex.
    두개의 스레드 A, B가 X라는 공유변수를 사용하는데, A의 역할은 X에 + 1 후 저장 / B의 역할은 X에 - 1 후 저장일 때
    A가 X를 읽은 후 B가 실행되기 전에 결과를 저장한다고 하면, A의 결과가 스레드 B의 결과데 덮어씌워지게 된다.
    참고 링크

  • 오픈소스이다.
    Redis는 AWS를 포함한 커뮤니티를 통해 지원되는 오픈소스로 다양한 클라이언트에 지원되기 때문에 기술 종속이 없는것이 장점이다.


‼️주의사항

  • 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있으므로 운영 플랜이 필요하다
  • 메모리 관리가 중요하다.
  • 싱글 스레드 특성상 한번에 하나의 명령만 처리하기때문에, 처리가 오래 걸리는 요청,명령은 피해야한다.
    (get,set과 같은 기본적인 작업은 10만건을 처리해도 몇초도 안걸린다)

0개의 댓글