Redis vs Memcached

김성민·2023년 7월 31일
0

Memcached와 Redis는 In-Memory 기반으로 동작한다는 점과, Key-Value 형태로 데이터를 저장한다는 점에서 공통적인 특성을 지니고 있습니다.
이러한 특성은 두 저장소 모두 빠르게 데이터를 처리할 수 있다는 장점으로 이어집니다. 그렇다면 어떤 차이점을 가지고 있을까요?

첫 번째는 failover(장애 극복 기능)입니다.

Redis의 경우, Replication을 지원하기 때문에 서버 하나에 장애가 발생하더라도 복제된 Slave 서버를 Master로 승격시켜서 서비스를 중단 없이 운영할 수 있도록 합니다.

하지만, Memcached의 경우에는 Replication을 지원하지 않습니다. 대신에 서비스 중단을 최소화하기 위해서 'Consistent Hashing'이라는 알고리즘을 통해 여러 대의 Memcached 서버에 데이터를 분산 저장하여 관리하게 됩니다.

Consistent Hashing으로 인하여 서버 1대가 장애가 발생하더라도, 나머지 노드에 있는 데이터들은 재배치할 필요 없이 장애가 발생한 노드의 데이터들만 손실되기 때문에 나머지 노드들은 지속적으로 운영이 가능합니다.

두 번째는 응답속도의 균일성에서 차이가 발생할 수 있습니다.

Redis의 경우, 대규모 트래픽이 발생하면 Memcached에 비해 응답속도의 안정성이 떨어질 수 있습니다.
이유는 Redis는 메모리 할당을 하는 데 있어서 jemalloc 알고리즘을 사용하여 매번 malloc과 free를 통하여 메모리를 할당하기 때문입니다. 이는 메모리 단편화 문제를 발생시키고, 이러한 단편화 문제로 인하여 응답속도가 느려질 수 있기 때문입니다.

반면, Memcached의 경우 메모리 할당에 있어서 slab allocator를 사용하기 때문에 내부적으로 메모리 할당을 다시 하지 않고 관리할 수 있습니다.

slab allocator에 대한 상세한 내용은 아래 링크를 확인하시면 더 세부적인 동작을 참고하실 수 있습니다.

세 번째는 Redis는 싱글 스레드로 동작하고, Memcached는 멀티 스레드로 동작을 한다는 점입니다.

'Redis가 싱글 쓰레드로 설계되었기 때문에 병목현상이 발생하지 않을까?'라는 생각을 하실 수 있습니다.
Redis 공식 홈페이지(https://redis.io/topics/faq)에도 이에 대한 FAQ를 진행하여 게시해놓은 걸 보면, 많은 사람들이 이 점에 대해 의문을 갖는 것을 알 수 있었습니다.

이에 대한 답변을 정리해보자면 우선, Redis는 데이터가 메모리에서 저장되고, 관리되기 때문에 CPU가 Redis에서 병목현상을 발생시키는 빈도가 적다고 명시되어 있습니다.

이에 따라 Redis가 제시한 벤치마크의 경우, 평균적으로 Linux 환경에서 Redis는 파이프라인을 사용하면 초당 약 100만 건의 요청을 전달 가능하다고 제시하였습니다.

그러므로 응용 프로그램이 O(N) 혹은 O(log(N)) 정도의 연산을 한다면 CPU에 큰 부담을 주는 것은 아니라고 명시하였습니다.

우리는 Session 을 Redis 에 많이 담아 놓고 사용하고는 합니다.
이러한 이유는 무엇일까요?
레디스는 key:value 구조로 지원하고, 메모리에서 불러오는 것이기 때문에 복잡한 연산이 필요없는 세션 데이터를 읽는 부분에서는 최적화된 속도를 낼 수 있습니다.
Memcached는 캐시 솔루션으로써 전원이 꺼지게 되면 데이터가 사라지기 때문에 영속성을 보장할 수 없다는 점에서 데이터베이스 혹은 저장소는 아닙니다.
Redis의 경우도 마찬가지 아닌가? 라고 생각하실 수 있으나, Redis는 AOF와 RDB 기능을 통해서 디스크에 데이터를 저장하여 영속성을 보장할 수 있습니다.

0개의 댓글