본문 바로가기

문제 해결, 기술 비교/개인프로젝트(북클럽)

In-memory Redis vs Memcached 비교하기

반응형

개요


최근 캐시로 Redis를 많이 사용합니다. 많은 자료들과 우수한 성능, Spring에서 풍부한 기능 제공 등 다양한 이유가 있습니다. 이번 시간에는 Redis 이외에도 캐시로 유명한 Memcached를 알아보고 비교해보도록 하겠습니다.

 

Memcached와  Redis 공통점


1. in-memory cache이다.
2. key-value 저장소이다. (redis는 데이터 구조저장소 성격에 가까움)
3. 데이터관리를 위해 NoSQL을 사용한다
4. RAM에 데이터를 보관한다

 

 

 In-memory database 란?


https://www.heavy.ai/technical-glossary/in-memory-database

 

 In-memory 데이터베이스는 데이터 저장을 메모리에 의존하는 특수 제작된 데이터베이스입니다. 디스크, SSD에 저장하는 데이터베이스와는 다릅니다. In-memory 데이터 저장소는 디스크에 접근을 없애므로 최소한의 응답시간을 가지도록 설계되었습니다. 모든 데이터가 메인 메모리에 저장되기 때문에, in-memory 데이터베이스는 서버 실패 혹은 작업 도중 데이터를 유실 할 위험이 있습니다. In-memory 데이터베이스는 스냅샷을 통해 혹은 각각 작업을 디스크에 저장함으로 데이터를 영속화 시킬 수 있습니다.

 

 캐시는 일반적으로 일시적인 데이터의 하위 집합을 저장하는 고속 데이터 저장 계층입니다. 따라서, 캐시를 이용한 데이터요청은 데이터가 저장된 저장소로 접근하는 것보다 훨씬 빠르게 제공됩니다. 캐싱으로 이전에 검색했거나 계산한 데이터를 효율적으로 재사용 할 수 있습니다. 캐시의 주된 목적은 느린 저장소 계층의 접근을 줄이고 데이터 성능을 향상시키기 위함입니다.

 

 

왜 Memcached를 쓸까요?


 2003년 처음 만들어진 Memcached는 현재 새로운 기능보다는 안정성과 최적화에 집중합니다.

 

1. 정적 데이터 캐싱에 효과적 


Memcached는 HTML같은 작은, 정적 데이터를 캐싱할 때 효율적입니다. Redis만큼 정교하지는 않지만 내부 메모리관리는 단순한 경우에 매우 뛰어납니다. (metadata에 더 적은 작원을 소모하기 때문이다) Strings(유일한 지원 데이터 타입)은 추가처리가 필요없어 읽기 전용에 적합합니다.

큰 규모의 직렬화된 데이터는 큰 저장공간이 필요합니다. Redis 데이터 구조는 데이터의 모든 형태를 그대로 저장할 수 있습니다. Memcached는 직렬화된 형태로 데이터 저장하도록 제한적이므로 효과적입니다. 따라서 Memcached를 사용할 때 좀 더 직렬화 오버헤드를 줄일 수 있습니다.

 

2. 멀티 쓰레드 기능 지원

Memcached는 멀티쓰레드이기 때문에, Redis에 비해 스케일링에 유리합니다. 컴퓨팅 자원을 추가함으로 스케일 업을 할 수 있습니다. 하지만 캐시된 데이터를 유실 할 확률도 높아집니다. Redis는 단일 쓰레드이기 때문에, 데이터 손실없이 수평으로 스케일링할 수 있습니다.



왜 Redis를 사용할까요?


Redis는 더 강력하고 유연한 기능들이 많은데, Memcached의 교훈에 따라서 2009년에 만들어졌습니다. 

 

1. 다양한 자료구조 및 용량 지원

Memcached는 key 이름을 250 byte까지 제한하고, 단순히 string만 사용합니다. Redis는 keys, value 이름을 512mb까지 지원합니다. hash, set, list, string 등 다양한 데이터 구조도 있어서 개발자들이 캐싱 및 캐시된 데이터 조작에 편리성을 제공합니다.

 

 

2. 다양한 삭제(eviction) 정책 지원

Cache는 메모리에 오래된 데이터를 삭제해서 새로운 데이터 공간을 확보하는 data eviction(데이터 삭제)라는 방식을 사용합니다. Memcached의 데이터 방식은 LRU이고 새로운 데이터와 크기가 비슷한 데이터를 임의 제거합니다. Redis는 사용자가 6가지의 다른 데이터 삭제 정책을 제공합니다. 또한 메모리 관리와 데이터 삭제 선택에 더 정교한 접근법을 제공합니다.  또한 lazy, active 삭제를 지원합니다.

 

 

3. 디스크 영속화(persistence) 지원

Memcached와 달리, Redis는 디스크 영구 저장이 가능합니다. 레디스의 데이터베이스에 있는 데이터들은 서버 충돌이나 재부팅 시에도 복구될 수 있습니다. (물론 유형에 따라서 수초에서 수분 사이에 데이터가 변경 될 수도 있습니다.) AOF, RDB Snapshot 2가지 방식이 있습니다.

 

 

4. 복제(replication) 지원

복제는 하나의 인스턴스로부터 또다른 레플리카 인스턴스를 복사하는 것입니다. 목적은 데이터의 복제본이 또다른 인스턴스에 유지되는 것입니다. 또한 레디스는 하나 이상의 레플리카를 가질 수 있습니다. Memcached는 써드 파티를 사용하지 않고서는 복제본을 가질 수 없습니다.

 

5. 트랜잭션(Transaction) 지원

Membercached는 원자적으로 동작하지만, 트랜잭션을 지원하지 않습니다.Redis는 명령을 실행하기 위해서 트랜잭션을 지원합니다. MULTI 커맨드를 통해서 트랜잭션을 시작하며 EXEC로 추가 명령어를 실행합니다. WATCH를 통해서 트랜잭션을 종료합니다.

 

 

Redis vs Memcached 성능 비교하기


다음은 in-memory 데이터베이스 성능측정에 관한 실험 결과 내용입니다

 

(상황에 따라서는 성능이 비슷할 수도 있습니다.이 실험은 참고 정도로만 보시면 됩니다.)

 

https://www.sciencedirect.com/science/article/pii/S1319157816300453?via%3Dihub#t0015 

 

A performance evaluation of in-memory databases

The popularity of NoSQL databases has increased due to the need of (1) processing vast amount of data faster than the relational database management s…

www.sciencedirect.com

 

버전은 다음을 사용합니다.

 

Database name Database model Version
Redis Key-value store 3.0.7
Memcached Key-value store 1.4.14

 

실험 종류는 다음과 같습니다.

 

1. key-value write

2. key로 value read

3. key로 key-value 삭제

4. 모든 데이터 조회

 

* 1-1 테이블. key-value write시 걸리는 시간(ms)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 34 214 1666 14,638
Memcached 23 100 276 2813

 

 

* 1-2 테이블. key-value write시 사용하는 메모리 (MB)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 2.5 3.8 4.3 62.7
Memcached 5.3 27.2 211 264.9

 

 

* 2-1 테이블. 주어진 key에 따른 value read 시 걸리는 시간 (MB)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 8 6 8 8
Memcached 9 24 14 30

 

 

* 2-2 테이블. 주어진 key에 따른 value read 시 사용하는 메모리 (MB)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 1.3 1.3 1.3 1.3
Memcached 1.3 2.5 1.3 2.5

 

* 3-1 테이블. 주어진 key에 따른 data delete시 걸리는 시간 (ms)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 0 1 0 0
Memcached 17 17 16 13

 

 

* 3-2 테이블. 주어진 key에 따른 data delete시 걸리는 시간 (MB)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 0 0 0 0
Memcached 2.2 2.1 2.2 2.2

 

 

* 4-1 테이블. 모든 data를 조회하는데 걸리는 시간 (ms)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 10 9 11 11

 

(Memcached는 모든 데이터를 조회하는 기능이 없습니다.)

 

 

* 4-2 테이블. 모든 data를 조회하는데 걸리는 시간 (MB)

Database Number of records
  1,000 10,000 100,000 1,000,000
Redis 2.1 2.1 2.2 2.2

 

 

결과 


- Memcached는 write 시간에서 굉장히 고성능을 보이고, Redis는 write에 메모리를 효율적으로 사용합니다.

 

- Redis는 Memcached에 비해 더 나은 read 시간 및 메모리 사용 효율성을 보여줍니다. 

 

- 또한, Redis는 key-value 삭제에서도 엄청난 성능을 보여주며, 메모리 관리도 효율적입니다.

 

- write 시간 이외에는 대부분의 성능에서 Redis가 우수함을 알 수 있습니다.

 

결론적으로 다양한 자료 구조를 지원하며, 성능면에서 우수한 결과를 내는 Redis를 사용하는 것을 권고합니다.

 

 

어떤 캐시를 사용해야 할까?


결론적으로 Redis를 사용합니다. 먼저, Redis는 다양한 기능을 지원합니다. 장애 대응을 위한 복제 및 영구 저장은 실시간 서비스나 데이터가 장애가 발생하면 빠르게 복구가 가능합니다. 이외에도 다양한 데이터 자료구조와 트랜잭션이 있어 비지니스 성격에 따라 고도화된 기능을 만들 수 있으며, 캐시 삭제 정책으로 효율적인 메모리 관리도 가능합니다

 

참고


https://www.instaclustr.com/blog/redis-vs-memcached/

https://www.infoworld.com/article/3063161/why-redis-beats-memcached-for-caching.html

https://aws.amazon.com/ko/nosql/in-memory/

https://www.baeldung.com/memcached-vs-redis

 

 

반응형