Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

스터디

[DB] Redis vs MySQL 본문

백엔드

[DB] Redis vs MySQL

_민영 2024. 12. 17. 14:31

Redis를 공부할 때 ChatGPT와 한 대화를 정리한 글입니다.

 

 

Redis vs MySQL

1. 데이터 저장 방식

Redis

  • 메모리(RAM)를 사용하여 데이터를 저장한다.
  • 키-값(Key-Value) 형태의 데이터 구조를 주로 사용하며, Has, List, Set 등 다양한 자료구조를 지원한다.
  • 휘발성(Volatile) 데이터베이스로, 서버가 재시작되면 데이터가 날아갈 수 있다. 하지만 지속성을 위해 디스크에 백업할 수 있다.
  • 빠른 읽기/쓰기를 제공하지만, 메모리 용량에 한계가 있다.

 

MySQL

  • 데이터를 디스크(파일 시스템)에 저장한다.
  • 관계형 데이터베이스로, 테이블을 사용해 데이터를 체계적으로 저장하고 관리한다.
  • 비휘발성(Non-Volatile) 데이터베이스로, 서버가 재시작되어도 데이터가 유지된다.
  • 디스크 I/O로 인해 Redis보다는 읽기/쓰기 속도가 상대적으로 느리다.

 

 

2. 속도

Redis

  • 메모리에서 작동하기 때문에 응답 속도가 매우 빠르다.
  • 초당 수만 번 이상의 읽기/쓰기 작업이 가능하다.
  • 데이터 접근이 빈번하고, 캐싱 또는 세션 관리처럼 빠른 성능이 필요한 경우에 유리하다.

 

MySQL

  • 디스크 기반이기 때문에 Redis보다 속도가 느리다.
  • 트랜잭션, 복잡한 쿼리, 대량의 데이터 처리가 필요할 때 적합하다.
  • 인덱싱과 최적화로 성능을 높일 수 있지만, Redis만큼의 속도는 보장하지 않는다.

 

 

3. 데이터 구조와 활용

Redis

키-값 형태의 데이터 외에도 다양한 자료구조(Hash, List, Set, Sorted Set 등)를 지원한다.

 

활용 예시:

  • 캐시: 자주 사용되는 데이터를 빠르게 제공
  • 세션 저장소: 웹 애플리케이션의 사용자 세션 관리
  • 순위표/리더보드: Sorted Set을 이용해 순위를 빠르게 처리
  • 메시지 큐: 데이터 스트림이나 Pub/Sub 기능을 활용

 

MySQL

SQL을 이용하여 테이블 간의 관계를 정의하고 복잡한 쿼리를 수행할 수 있다.

 

활용 예시:

  • 데이터 영구 저장소: 사용자 정보, 주문 기록, 게시물 관리
  • 트랜잭션: 금융 서비스나 주문 처리에서 데이터 일관성을 유지
  • 대량 데이터 분석: 복잡한 조인(Join)과 집계(Aggregation) 수행

 

 

4. 데이터 일관성

Redis

  • 데이터 일관성보다는 속도와 유연성에 중점을 둔다.
  • 특정 경우(데이터 손실 허용 범위)에서 성능을 우선시할 수 있다.

 

MySQL

  • ACID 트랜잭션을 지원하며, 데이터의 일관성 및 무결성을 보장한다.
  • 금융, 의료 등 데이터 정확성이 중요한 시스템에서 많이 사용된다.

 

 

5. 비용과 용량

Redis

  • 데이터를 메모리에 저장하므로 비용이 높을 수 있다.
  • 메모리(RAM) 용량에 따라 저장할 수 있는 데이터의 양이 제한된다.

 

MySQL

  • 디스크에 데이터를 저장하기 때문에 대량의 데이터를 저장하는 데 비용이 저렴하다.
  • 데이터를 많이 저장할 수 있으며 확장성이 뛰어나다.

 

 

6. 요약

항목 Redis MySQL
저장소 메모리 (휘발성) 디스크 (비휘발성)
속도 매우 빠름 상대적으로 느림
데이터 구조 키-값, 다양한 자료구조 테이블과 관계형 데이터
활용 예시 캐시, 세션 관리, 메시지 큐 등 사용자 데이터, 트랜잭션, 분석
일관성 느슨한 일관성 강한 일관성 (ACID 지원)
비용 RAM 비용이 높음 저장 비용이 저렴

 

 

 

Redis는 메모리 기반으로 빠른 속도가 필요할 때 사용하고, MySQL은 영구 저장과 데이터 무결성이 중요한 경우에 사용한다. 두 시스템을 함께 사용하면 MySQL에서 데이터를 영구 저장하고, Redis에서 캐싱과 빠른 접근을 지원하는 하이브리드 아키텍처를 구성할 수도 있다.

 

MySQL과 Redis를 같이 사용하는 것은 매우 일반적이고 효율적인 아키텍처이다. 두 데이터베이스의 장점을 조합해서 시스템의 성능과 확장성을 크게 개선할 수 있다.

 

 

MySQL과 Redis를 같이 사용하는 이유

MySQL

  • 데이터를 영구 저장하고 복잡한 관계형 쿼리를 처리한다.
  • 데이터 무결성과 일관성을 보장한다.

 

Redis

  • 캐시 역할을 하며, 자주 사용되는 데이터를 빠르게 읽고 쓴다.
  • MySQL의 부하를 줄여서 성능을 최적화한다.

 

 

함께 사용하는 대표적인 방법

1. 캐싱 계층으로 Redis 사용

  • 자주 사용되는 데이터를 Redis에 캐싱한다.
  • 데이터 요청 시 다음과 같은 흐름으로 처리한다.
    1. Redis에서 데이터를 먼저 확인 (캐시 조회)
    2. Redis에 데이터가 없으면 MySQL에서 가져와서 Redis에 저장 (캐시 갱신)
    3. 이후 동일한 데이터 요청은 Redis에서 바로 반환

예시

  • 사용자가 자주 보는 게시물 정보
  • 로그인 세션 정보
  • 인기 검색어, 순위표 등

 

2. 세션 관리

  • 웹 애플리케이션에서 로그인 세션을 Redis에 저장하고 관리한다.
  • Redis는 메모리 기반이기 때문에 세션 데이터를 빠르게 읽고 쓸 수 있다.

예시 흐름

  • 사용자가 로그인하면 세션 정보를 Redis에 저장한다.
  • 다음 요청에서는 Redis에서 세션 정보를 가져온다.
  • 만약 세션이 만료되면 Redis에서 데이터를 삭제한다.

 

3. 실시간 데이터 처리

  • Redis는 Pub/Sub 기능과 Sorted Set 같은 자료구조를 제공하기 때문에, 실시간 데이터나 이벤트 처리에 유리하다.
  • MySQL은 여전히 데이터의 영구 저장을 담당한다.

예시

  • 실시간 채팅: 메시지를 Redis를 통해 처리
  • 리더보드: 점수를 Redis의 Sorted Set에 저장해서 순위를 빠르게 계산
  • 알림 시스템: 이벤트를 Redis Pub/Sub으로 처리

 

4. 읽기 부하 분산

읽기 요청이 많은 서비스에서 Redis를 읽기 전용 캐시로 사용하면 MySQL의 부하를줄일 수 있다.

 

예시

  • 쇼핑몰의 상품 조회 기능: 상품 정보는 MySQL에 저장되지만, 자주 조회되는 상품은 Redis에 캐시해 빠르게 제공

 

 

사용 예시 흐름 (Cache Aside 패턴)

아래는 MySQL과 Redis를 함께 사용하는 대표적인 캐시 패턴 중 하나인 Cache Aside 패턴의 흐름이다

  1. 클라이언트 요청 -> Redis에 데이터 요청
  2. Redis에 데이터가 있으면 -> Redis에서 바로 반환 (캐시 히트)
  3. Redis에 데이터가 없으면 -> MySQL에서 데이터 조회 (캐시 미스)
  4. MySQL에서 가져온 데이터를 Redis에 저장 (캐시 업데이트)
  5. 이후 동일한 요청은 Redis에서 처리 

 


 

Redis는 휘발성(Volatile) 데이터베이스지만 데이터 지속성(Persistence)을 위해 디스크에 데이터를 백업하는 기능을 제공한다. Redis에서는 다음 두 가지 주요 방법을 통해 데이터를 백업하고 저장할 수 있다.

 

RDB vs AOF

1. RDB (Redis Database File) - 스냅샷 방식

RDB는 특정 시점의 데이터를 스냅샷(Snapshot)으로 저장하는 방식이다. Redis는 데이터를 주기적으로 디스크에 덤프하여 .rdb 파일로 저장한다.

 

작동 방식

  • Redis는 메모리의 데이터를 바이너리 형태로 디스크에 저장한다.
  • 설정된 주기 또는 조건에 따라 자동으로 스냅샷이 생성된다.
  • 스냅샷 파일(dump.rdb)은 Redis 재시작 시 데이터를 복구하는 데 사용된다.

 

장점

  • 빠른 백업과 복원: RDB 파일은 바이너리 형태라서 저장과 읽기가 빠르다
  • 데이터 용량이 작다.
  • 전체 백업이 가능하므로, 복구 시점을 특정 시점으로 고정할 수 있다.

 

단점

  • 실시간 데이터 손실 가능성: 백업 주기 사이에 발생한 데이터는 저장되지 않을 수 있다.
  • 데이터 변경이 빈번하면 RDB 파일을 자주 생성해야 하므로 시스템 리소스를 많이 소모할 수 있다.

 

 

2. AOF (Append-Only File) - 명령어 로그 방식

AOF는 Redis에서 수행된 모든 명령어를 로그 파일에 기록하여 백업하는 방식이다.

 

작동 방식

  • 클라이언트가 Redis에 수행한 모든 쓰기 명령어(예: SET, HEST 등)를 순차적으로 파일에 기록한다.
  • Redis가 재시작될 때 이 명령어를 다시 실행해서 데이터를 복구한다.

 

장점

  • 데이터 손실 최소화: 설정에 따라 실시간으로 데이터를 백업할 수 있다.
  • 더 높은 지속성: 모든 명령이 기록되기 때문에 RDB 방식보다 손실이 적다.

 

단점

  • 파일 크기: 명령어가 계속 쌓이기 때문에 파일이 매우 커질 수 있다.
  • 복구 속도: RDB보다 느리다. 파일에 기록된 명령어를 다시 실행해야 하기 때문이다.
  • 성능 오버헤드: 실시간으로 모든 명령어를 기록하면 시스템 리소스가 소모된다.

 

 

RDB와 AOF 비교

특징 RDB AOF
백업 방식 스냅샷 (전체 데이터 저장) 명령어 로그 (모든 변경 기록)
백업 주기 주기적으로 백업 실시간 또는 설정된 주기마다 백업
데이터 손실 가능성 있음 (백업 주기 사이 데이터 손실) 거의 없음 (실시간 설정 시 최소화)
복구 속도 빠름 느림 (명령어 재실행 필요)
파일 크기 작음 큼 (모든 명령이 기록됨)
성능 오버헤드 낮음 높음 (명령어 기록으로 인한 부하)

 

 

 

RDB와 AOF를 함께 사용하기

Redis는 RDBAOF동시에 사용할 수 있다.

  • RDB: 주기적인 스냅샷으로 빠르게 복구 가능
  • AOF: 실시간으로 명령어를 기록해 데이터 손실 최소화

 

Redis가 재시작될 때는 AOF 파일을 우선으로 복구한다. AOF 파일이 없으면 RDB 파일을 사용한다.

 

'백엔드' 카테고리의 다른 글

[DB] 샤딩(Sharding)  (0) 2024.12.17
[DB] Join  (0) 2023.05.20
CORS  (0) 2023.04.13
[JavaScript] 프로토타입과 클래스  (3) 2023.04.10
[JavaScript] 싱글톤 패턴과 정적 클래스  (0) 2023.04.07