새소식

데이터 엔지니어링/기술스택 및 알쓸신잡

[Redis] 레디스? Nosql? 인메모리? 왜 쓰는건데?

  • -

직전 포스팅에서 에어플로우 DAG, operator들을 뜯어보면서 sensor 특히, RedisSensor에 대해 설명하기로 했었다.
근데 그 전에, Redis가 뭔지 알아야하지 않는가?
그래서 레디스가 무엇인지, 왜 사용하는지에 대해 먼저 포스팅하려한다.


TODO List

  • 레디스의 필요성
  • 레디스 특징 (인메모리)
  • Nosql로서 레디스 (캐싱)
  • MQ로서 레디스

직전 포스팅에서 에어플로우 DAG, operator들을 뜯어보면서 sensor 특히, RedisSensor에 대해 설명하기로 했었다.

근데 그 전에, Redis가 뭔지 알아야하지 않는가?

그래서 레디스가 무엇인지, 왜 사용하는지에 대해 먼저 포스팅하려한다.

1. 레디스의 필요성

'그래서 레디스를 왜 쓰는걸까?'

간단히 답하자면 사용하기 쉽고, 빨라서이지만,
(더 들어가면 비동기, 원자성 등 여러 요인이 추가로 있지만)
이 질문에 근본있게 답하기 위해서는 레디스가 무엇인지부터 알아야한다.

 

먼저 레디스는 근본적으로 데이터베이스이다.
다시말해, 결국 데이터를 저장하고 조회하기 위한 용도로 사용하는 기술 스택이라는 것이다.

'그럼 postgres, mysql 등 여러 데이터베이스가 있는데 Redis는 뭐가 특별한걸까?'

 

여기서 차별점은 Nosql이라는 것과 인메모리 데이터베이스라는 것이다.


2. 레디스의 특징

앞에서 말했듯 레디스의 가장 큰 차별점 두가지는,

  1. 인메모리 데이터베이스라는 점
  2. NoSQL이라는 점

이 두 가지에 대해 하나씩 살펴보자.

2.1 인메모리 데이터베이스란?

인메모리 데이터베이스는 이름 그대로 데이터를 메모리(RAM)에 저장하는 데이터베이스이다.

 

'그럼 보통 데이터베이스는 어디에 저장하는데?'

 

일반적인 데이터베이스들(MySQL, PostgreSQL 등)은 디스크(HDD, SSD)에 데이터를 저장한다.
데이터를 영구적으로 보관하기 위해 디스크에 저장하는 것이 당연하다고 생각할 수 있다.

하지만 디스크 접근은 메모리 접근보다 훨씬 느리다.

쉽게 비유하자면,

  • 디스크는 창고에 물건을 찾으러 가는 것 (멀고 시간이 오래 걸림)
  • 메모리는 바로 옆에 있는 서랍에서 물건을 꺼내는 것 (가깝고 빠름)

더 자세한 설명은 밑의 링크를 읽어보기를...ㅎㅎ

 

[CS 지식] CPU, RAM, SSD, HDD....스왑 메모리는 뭐야?

TODO list전체적인 개념 비유CPU 이론RAM 이론SSD, HDD 비교서론이번에는 잠깐 기초중에 기초 CS 지식인 CPU, RAM, SSD, HDD,더 나아가서 스왑 메모리와 스왑 메모리 설정하는 방법까지 설명하고자한다.실제

9unu.tistory.com

 

암튼, 레디스는 모든 데이터를 메모리에 올려놓고 작업하기 때문에 엄청나게 빠른 속도를 자랑한다.

'근데 메모리에 저장하면 컴퓨터 끄면 다 날아가는거 아냐?'

맞다! 레디스도 이 문제를 알고 있기 때문에 데이터를 디스크에 백업하는 기능을 제공한다.

  • RDB (특정 시점 스냅샷)
  • AOF (모든 명령어 로깅)

같은 방식으로 데이터 영속성을 보장한다.

2.2 NoSQL이란?

NoSQL은 Not Only SQL의 약자로, 기존의 관계형 데이터베이스와는 다른 방식으로 데이터를 저장하고 처리하는 데이터베이스를 말한다.

관계형 데이터베이스(MySQL, PostgreSQL 등)가 테이블과 행, 열로 데이터를 표현한다면,
NoSQL은 데이터 유형에 따라 다양한 방식으로 저장한다.

 

그 중 레디스는 키-값(Key-Value) 스토어 방식의 NoSQL이다.
즉, 모든 데이터는 키와 값의 쌍으로 저장된다.

이런 단순한 구조 덕분에 레디스는 매우 빠르고 확장성이 좋다.

NoSQL의 큰 특징 중 하나는 ACID가 아닌 BASE 원칙을 따른다는 것이다.

  • Basically Available: 항상 응답 가능
  • Soft state: 언제든 상태가 변할 수 있음
  • Eventually consistent: 결국에는 일관성을 유지

이러한 특성 때문에 NoSQL은 높은 가용성과 확장성을 제공하지만, 일시적으로 데이터 일관성이 깨질 수 있다.

(이래서 대부분 원천소스DB는 RDBMS를 사용하는 듯..)


3. 캐싱 도구로서의 레디스

레디스의 가장 흔한 사용 사례 중 하나는 캐싱이다.

3.1 캐싱이 필요한 이유

사용자가 많아질수록 DB 쿼리가 계속 발생하고, 서버는 점점 느려진다.

 

'똑같은 데이터를 계속 DB에서 가져와야 할까?'

 

이에 대한 해답이 캐싱이다.

캐싱은 자주 접근하는 데이터를 빠르게 조회할 수 있는 임시 저장소에 보관하는 것이다.

비유하자면,

  • 캐싱 없이 DB 조회: 매번 도서관에서 책을 찾아 읽기
  • 캐싱 사용: 자주 읽는 책은 내 책상 위에 두고 필요할 때마다 바로 읽기

3.2 레디스의 캐싱 활용

레디스는 다음과 같은 특성으로 인해 캐싱에 완벽한 도구이다:

  1. 초고속 응답 시간: 메모리 기반이라 빠른 응답 속도
  2. 다양한 데이터 타입 지원: 문자열, 리스트, 해시, 셋 등
  3. 데이터 만료 기능: TTL(Time To Live) 설정으로 캐시 자동 관리
  4. 원자적 연산: 동시성 문제 없이 데이터 처리

이러한 특성을 활용한 캐싱 시나리오는 다음과 같다:

  1. 사용자가 특정 데이터를 요청함
  2. 서버는 먼저 레디스에서 해당 데이터가 있는지 확인
  3. 레디스에 있으면 바로 반환 (캐시 히트)
  4. 없으면 DB에서 데이터를 가져옴 (캐시 미스)
  5. 가져온 데이터를 레디스에 저장하고 사용자에게 반환

이런 방식으로 자주 조회되는 데이터에 대한 DB 부하를 크게 줄일 수 있다.


4. 메시지 큐로서의 레디스

'레디스는 캐싱만 잘하나?'

전혀 그렇지 않다!
레디스는 메시지 큐(Message Queue) 시스템으로도 훌륭하게 작동한다.
그리고 이것이 내가 실제로 가장 많이 활용했던 부분이다.

4.1 메시지 큐란?

메시지 큐는 비동기 통신을 위한 중간 저장소라고 생각하면 된다.

서비스 A가 서비스 B에게 바로 요청하는 대신, 메시지 큐에 메시지를 넣고 B는 자기가 가져가고 싶을 때 알아서 가져가서 처리한다.

비유하자면:

  • 동기 통신: 전화로 직접 주문 (주문자가 대기해야 함)
  • 비동기 통신: 주문서를 박스에 넣어두면 직원이 주문서를 처리 (주문자는 기다릴 필요 없음)

4.2 레디스를 MQ로 사용하는 방법

레디스는 다음과 같은 자료구조로 MQ를 구현할 수 있다:

  1. List: 한쪽에서 넣고 다른쪽에서 꺼내는 방식으로 큐 구현
    • 예시: 작업을 리스트에 넣고 워커가 순서대로 가져가서 처리
  2. Sorted Set: 우선순위가 있는 작업 큐
    • 예시: 긴급한 작업은 높은 우선순위로, 일반 작업은 낮은 우선순위로 처리
  3. Pub/Sub: 발행-구독 모델 구현
    • 예시: 마치 유튜브 채널 구독처럼, 특정 채널을 구독해놓으면 그 채널에 올라오는 모든 메시지를 받아볼 수 있는 방식.
  4. Streams: 가장 강력한 MQ 기능 (Redis 5.0 이상)
    • 예시: 실시간으로 쌓이는 로그에 따라 여러 워커가 각자의 목적에 맞춰 가져가서 처리하는 방식

각 자료구조마다 사용법은 다음 포스팅에서 다룰 예정이다! 특히 List를 주로 다룰 것 같다!

4.3 MQ로서 레디스의 장단점

장점:

  1. 간단한 설정: 복잡한 MQ 시스템 없이도 빠르게 구축 가능
  2. 빠른 처리 속도: 인메모리 특성으로 초고속 메시지 처리
  3. 확장 가능한 구조: 클러스터로 확장 가능
  4. 다양한 패턴 지원: 작업 큐, Pub/Sub 등 다양한 메시징 패턴 구현 가능

단점:

  1. 메시지 유실 가능성: 메모리 특성상 장애 시 데이터 유실 위험 (AOF로 완화 가능)
  2. 제한된 기능: RabbitMQ, Kafka와 같은 전문 MQ에 비해 고급 기능 부족
  3. 메모리 제약: 메모리 크기만큼만 메시지 저장 가능

실제로 큰 규모의 프로젝트에서는 Kafka 같은 MQ를 사용하는 것 같지만, 빠른 개발을 위해서는 레디스가 충분히 좋은 선택이라고 생각한다.


5. 마무리

지금까지 레디스가 무엇인지, 왜 사용해야 하는지에 대해 알아봤다.

  1. 인메모리 데이터베이스로서 빠른 성능 제공
  2. NoSQL로서 유연한 데이터 저장 방식 제공
  3. 캐싱 도구로서 서버 부하 감소
  4. 메시지 큐로서 비동기 처리 지원

복잡한 시스템, 특히 분산 처리 시스템을 구축할 때, 레디스는 여러 용도로 사용되어 서비스의 성능을 크게 향상시킬 수 있다.

다음 포스팅에서는 레디스를 메시지 큐로 활용한 실제 예시를 더 자세히 다루면서, Lua 스크립트를 활용한 원자적 연산, pipelining을 통한 성능 최적화 등 더 심화된 내용을 살펴볼 예정이다.

특히 파이썬을 통해 레디스를 어떻게 실제로 조작하는지 코드와 함께 살펴볼 것이다.

ㄱㅊㅁ_ㅇㅈ

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.