Redis 찍먹해보기

seuls2·2023년 9월 18일

기술

목록 보기
1/2
post-thumbnail

Redis란

Redis는 Remote Dictionary Server의 약자로 In-Memory & Key-Value 기반의 NoSql DBMS이다.
Redis는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 IoT 애플리케이션에서 널리 사용되고 있다고 한다.

Redis의 특징들

1. Single Thread

싱글 스레드의 강력한 강점은 원자성(Atomic)을 보장한다는 점이다.
원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다.

멀티스레드의 경우 스레드간 자원을 공유하기 때문에, Race Condition이 발생할 수 있다.

Race Condition (경쟁 상태)
두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다. 즉 두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 뜻한다.

싱글 스레드 구조를 통해 Race Condition 문제를 해결할 수 있고, 부하가 강한 상황에서도 Redis가 예측가능하고 일관된 대기 시간을 제공하게 하고, 모든 요청이 순서대로 처리되기 때문에 자원에 대한 경쟁이 없다.

2. In-Memory

데이터들이 Memory, 즉 RAM에 저장된다. 디스크를 읽는 속도보다 메모리를 읽는 속도가 더 빠르기 때문에, 데이터를 빠르게 읽고 쓸 수 있다.

3. Key-Value

Redis는 key-value로 데이터가 이루어져 있기 때문에, key를 통해 데이터를 찾을 수 있다.

redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"

4. 다양한 데이터 타입 지원

String, Set, Sorted Set, Hash, List을 저장할 수 있는 기능이 있어 개발자들의 편의성과 성능을 높여줄 수 있다.
예시로 SCORE를 저장하고 정렬하여 출력한다고 했을 때, RDBMS는 DB에 데이터를 저장하고 저장한 SCORE값으로 정렬하여 읽어와야 하는데, Redis의 Sorted-Set 구조를 활용하면 속도와 편의성을 동시에 얻을 수 있다.

5. Expires 및 데이터 영속성

Redis는 각 데이터(key-value)에 만료시간을 설정하여 일정 시간 후 데이터를 자동으로 없앨 수 있다.
Expires 를 설정하지 않으면 영속적으로 데이터를 보존할 수 있다.

6. Pub/Sub 지원

특정 주제를 구독한 구독자에게 메시지를 발행하는 통신 방법으로, publisher가 메시지를 publish 하면 해당 Topic을 구독하고 있는 다수의 subscriber가 메시지를 받을 수 있는 구조다.
publish한 메시지는 따로 보관되지 않고, subscriber가 수신했는지도 따로 확인하지 않기 때문에, 메시지를 빠르게 보내고 싶을 때나 100% 전송 보장이 되지 않아도 될 때 활용할 수 있다.

Pub/Sub 활용 예시: 실시간 알림 시스템, 채팅 애플리케이션, 주식 시장 데이터 스트리밍 등

  • 게시(Publish)
    메시지를 게시하는 클라이언트는 특정 채널에 메시지를 발송한다. 클라이언트는 원하는 채널로 메시지를 게시할 수 있다.
  • 구독(Subscribe)
    메시지를 받고자 하는 클라이언트는 특정 채널을 구독한다. 클라이언트가 채널을 구독하면, 해당 채널로 게시된 모든 메시지를 수신할 수 있다.

Redis 사용 사례들

  • Cache
  • 인증 토큰 및 세션 정보 등을 저장
  • 모든 페이지의 방문 횟수 조회
  • 쇼핑 카트 데이터
  • 푸시 알림 서비스
  • 실시간 채팅 애플리케이션

Redis의 영속성 보장

메모리는 휘발성이기 때문에, 서버를 재시작하면 데이터가 사라진다. 하지만 Redis는 데이터 영속성을 보장하는 방법들이 있다.

RDB(Snapshotting) 방식

  • 특정 시점에 메모리에 있는 내용 전체를 디스크에 옮겨 담는 방식
  • AOF 파일보다 크기가 작아 보다 빠르게 로드할 수 있다.

AOF(Append On File) 방식

  • Redis의 모든 write/update 연산 모두 log 파일에 기록하는 형태 => AOF 파일은 주기적으로 압축, 재작성 과정을 거쳐야 함
  • 레디스가 다시 시작되면 AOF 로그에 저장된 명령을 재실행하여 기존 데이터를 복구한다.

만약 Redis를 캐시로만 사용한다면 RDB, AOF를 사용할 필요가 없다. 하지만 백업은 필요하지만 어느정도 데이터 손실이 발생해도 괜찮은 경우는 RDB를 사용하고, 장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우는 AOF를 사용하는 등 상황에 맞는 방법을 선택해야 한다.

profile
공부 기록용 ( ᵕ·̮ᵕ )♩

0개의 댓글