본문 바로가기

DB

[DB] In-memory DB Redis와 Memcached 비교

 

1. 데이터 모델

Redis: 데이터 모델은 다양하며, String, Hash, List, Set, Sorted Sets 등을 지원 -> 다양한 데이터 구조를 지원하기 때문에 복잡한 데이터를 다룰 때 적합.

Memcached: 간단한 키-값 쌍 데이터 모델. 단순한 캐싱이나 분산 세션 스토어 등에 적합

 

2. 데이터 지속성

Redis: 지속성을 지원하며 디스크에 데이터를 저장하고 백업할 수 있음. 스냅샷 및 AOF(Append Only File) 로그 파일을 사용하여 지속성 제공

더보기


스냅샷(Snapshot)
스냅샷 메커니즘은 주기적으로 Redis의 데이터 상태를 스냅샷 파일로 디스크에 저장
주기적으로 또는 특정 조건이 충족될 때 스냅샷을 생성하여 데이터의 상태를 디스크에 저장하므로 장애 시 데이터를 복구할 수있음 
스냅샷 파일은 이진 형식으로 저장되며 Redis 서버가 재식돠면 이 팡리 을 복구하여 데이터 복구


AOF(Append Only File)
변경된 Redis 명령을 로그 형식으로 기록하는 메커니즘
Redis에 실행된 모든 쓰기 작업(명령)을 AOF 파일에 기록하여 디스크에 저장
서버가 재시작 되면 AOF 파일에 저장된 명령을 재실행하여 데이터를 복구
스냅샷보다 더 신뢰성 있는 지속성을 제공하지만 일반적으로 스냅샷보다 더 많은 디스크 공간 사용 

 

Memcached: 메모리만을 사용하며 데이터는 서버 재시작시 손실될 수 있음 -> 복구에 민감하지 않은 데이터이고 속도를 향상 시키는 목적에 적합

 

 

3. 캐싱 및 저장소

Redis

  • 캐싱, 데이터베이스, 메시지 브로커, 세션 스토어 등 다양한 용도로 사용할 수 있음
  • 캐싱 용량: 대용량 메모리 환경에서 많은 양의 데이터 캐싱 가능

 

Memcached

  • 주로 캐싱에 사용되며, 간단한 키-값 쌍을 저장하는 데에 특화되어 있음
  • Redis에 비해 데이터 저장 및 검색에 있어서 더 경제적인 메모리 활용

 

4. 분산 시스템

Redis: 클러스터링 및 레플리케이션을 통한 고가용성과 확장성 제공

Memcached: 간단한 분산 환경에서는 사용이 쉽지만, 높은 가용성 및 확장성을 위해선 추가적인 구성 필요

 

 

5. 성능

Redis: 일반적으로 Memcached보다 높은 성능을 가짐. 다양한 데이터 구조와 높은 유연성으로 인해 더 많은 사용 사례에 적합

Memcached: 간단하고 빠르게 데이터를 읽고 쓸 수 있음 -> DB/API 통신 속도 감소를 위한 데이터 캐싱 처리 사용 시 유리 

 

6. 메모리

Redis

메모리 단편화가 발생하기 쉬움

메모리를 2배 사용(실제로 필요한 메모리보다 더 많은 양의 메모리를 사용하게 됨)

 

Memcached

내부적으로 slab 할당자를 사용하고 있기 때문에 메모리 할당이 잦지 않음

slab ▼

더보기

1. Slab 할당자(slab allocator)란?

메모리 할당 및 해제를 효율적으로 관리하기 위한 메모리 할당 알고리즘으로 주로 커널이나 운영체제에서 사용되며, 메모리를 작은 조각으로 나누어 캐시에 저장하는 방식으로 동작함

2. Slab 할당자의 동작 

Slab 할당자의 동작은 크게 세 단계로 나눌 수 있음



1) Slab 클래스의 생성

서로 크기가 다른 세 개의 클래스를 생성. 각 클래스는 고정된 크기의 블록들로 구성되며, 이 블록들을 할당 단위로 사용

작은 블록들이 많은 클래스, 중간 크기의 블록들이 적은 클래스, 큰 블록들이 가장 적은 클래스로 구성



2) Slab의 할당과 해제

캐시에는 미리 정의된 수의 slab이 있고, 각 slab은 특정 클래스의 블록을 저장함

메모리를 할당할 때, 적절한 크기의 클래스를 선택하고 해당 클래스의 slab에서 사용 가능한 블록을 할당함

메모리를 해제할 때는 해당 블록을 사용한 클래스의 slab으로 반환


3) Slab의 캐시 및 재사용
사용된 slab들은 캐시에 저장되어 재사용되기 때문에 새로운 할당 요청이 들어올 때마다 slab을 새로 생성하는 오버헤드를 줄일 수 있음

미리 할당된 slab이 가득 차면 해당 slab을 캐시에서 제거하고 다시 사용 가능한 slab을 새로 생성



3. Slab 할당자의 장점

효율적인 메모리 사용: 고정된 크기의 블록을 사용하므로 메모리 단편화가 줄어들고, 메모리를 효율적으로 사용할 수 있음

빠른 할당 및 해제: 미리 할당된 slab을 사용하므로 메모리 할당 및 해제가 빠름

캐시 기반의 최적화: slab을 캐시에 저장하여 새로운 할당 요청에 대한 응답 시간 최적화

Slab 할당자는 주로 운영체제의 커널 내에서 사용되며, 사용자 수준의 애플리케이션에서 직접 사용되기보다는 메모리 관리를 추상화하는 라이브러리 등에서 활용될 수 있음

 

7. 스레드 모델

Redis: 싱글 스레드 모델 사용

Memcached: 멀티 스레드 모델 사용

 

 

8. 결론 

Redis 선택 시:

다양한 데이터 구조를 활용해야 하는 경우.

지속성이 필요한 경우.

높은 가용성과 확장성이 필요한 경우.

메시지 브로커, 세션 스토어, 캐시 등 다양한 용도로 활용할 경우.

 

Memcached 선택 시:

단순한 캐싱이나 분산 세션 스토어 등 간단한 키-값 쌍이 필요한 경우.

빠른 응답 시간이 중요한 경우.

쉽게 설정하고 사용해야 하는 경우. -> 데이터 타입과 API가 Redis에 비해 다양하지 않기 때문에