Q. “Redis 와 Memcached 중에 어떤 것이 더 좋아요?”
A. “Memcached 는 캐시 솔루션이고, 이러한 Memcached 에 저장소의 개념이 추가된 것이 Redis 다”
- Redis 운영 관리’ 강대명 저
‘캐시’는 빠른 속도를 위해서 어떤 결과를 저장해 두는 것을 의미하며, 또한 ‘데이터가 사라지면 다시 만들 수 있다’ 는 전제를 내포하고 있다. 그런데 저장소라는 개념이 추가되며, ‘데이터가 유지되어야 한다’는 특성을 가지게 된다.
Memcached
-
작고 변하지 않는 데이터, 예를들어 HTML 코드의 부분을 캐싱할 때 내부 메모리 관리가 Redis 만큼 복잡하지 않아 능률적이기 때문에 Memcached 는 메타 데이터에 있어 비교적 작은 메모리를 사용한다.
-
‘Memcached’ 에서 지원하는 유일한 데이터 타입인 String 은 오로지 읽기 전용이고 더 이상 처리가 필요 없기 때문에 데이터를 저장하기에 좋다.
-
‘Redis’ 에 비해 수평적 확장에 약간의 좋은 점이 있다.
Redis
- 캐시 용도로 매우 강력하게 사용할 수 있다. 예를들어 캐시한 콘텐츠를 미세하게 튜닝하거나 지속성에 전반적인 효율성 등을 조정할 수 있다.
** 유사점*
- in-memory 위에서 동작하는 ‘key-value’ 스토리지로 둘다 NoSQL 에 속하는 데이터 관리 솔루션.
In-Memory DB (IMDB)
- : 메모리 기반의 데이터베이스
-
DBMS를 메모리에 설치하여 처리 데이터 I/O에 소요되는 시간이 없어 하드디스크 기반의 DBMS보다 최대 1000배 가량 빠르게 처리
-
모든 데이터는 메모리 안에 있으며, 이 때문에 캐시 관점에서 매우 유용하다.
-
퍼포먼스 측면에서 두 데이터 스토리지는 처리량이나 지연 속도 등 동일한 특성을 나타낸다.
-
메모리에 저장되어 있어 매우 빠른 정렬이 가능하다.
** 다른점*
- 캐시 관리 측면
-
- 캐시는 새로운 데이터를 캐시하기 위해 오래된 데이터를 지우는 방식의 메커니즘을 사용하고 있다.
- ‘Memcached’ 는 LRU 알고리즘을 사용하고, ‘Redis’는 6가지 데이터 추출 정책이 있다. 또한 ‘Redis’는 좀 더 정교한 메모리 관리 방식을 사용한다.
- ‘Redis’는 어떠한 오브젝트 또한 캐시 할 수 있도록 편리한 기능을 제공, ‘Memcached’ 는 키의 이름이 250 바이트로 제한 되며 캐시 값의 용량은 1MB 로 제한된다. (제한적이지만 용량을 늘릴 방법이 있다고 한다) 또한 ‘Memcached’는 오로지 문자열만 캐시할 수 있다. ‘Redis’는 key, value의 용량을 각각 512MB 까지 크게 사용할 수 있고 그것들을 안전한 바이너리로 관리한다.
- 데이터 저장 방식
- ‘Redis’ 는 데이터를 투명하게 관리, 데이터를 저장할 때 서버가 데이터를 직접적으로 조작한다는 것.
: ‘Redis’ 에 있는 160가지 이상의 명령으로 데이터를 처리, 조직하며 데이터 처리를 다른 시스템에 전달하지 않고 직접적으로 핸들링 가능하게 한다.
- ‘Redis’ 는 Hash 를 이용해 오브젝트의 필드 그리고 값을 유니크하게 관리 할 수 있다.
: ‘Redis’ 의 Hash 는 전체 문자열을 가지고 온다던지 역직렬화하고 그것의 값을 업데이트 하고 다시 시리얼라이즈 하고 또 문자열을 바꾼다던지 자잘한 모든 업데이트 기능을 지원한다.
- ‘Redis’는 다양한 데이터 타입(Data Format)을
- : ‘String’, ‘List’, ‘Set’, ‘Sorted sets’, ‘Hash’ 등을 지원.
-
애플리케이션 단에서 편하게 데이터를 저장하고 사용 할 수 있다.
- 지속성
- ‘Redis’는 유사시에 데이터 백업 할 수 있는 옵션을 제공한다.
- : 서버가 의도치 않게 종료되거나 shut down이 일어 났을 때 재 기동 하면서 다시 복구 될 수 있게 디자인 되었다.
-
캐시는 휘발성의 데이터 이지만 이 데이터를 Disk 에 저장 시킴으로써 캐싱 시나리오에 많은 도움을 줄 수 있다.
=> 백업 Disk 가 존재하면 Redis 서버가 재시작 후 캐시를 다시 메인 데이터 스토리지에서 가지고 오는 부하를 덜 수 있다.
- 리플리케이션 (복제, Replication)
-
‘SnapShot’
-
‘AOF’
** 장단점 (pros and cons…)*
Redis 의 단점
-
메모리 파편화가 발생하기 쉽다. (메모리 정책 때문인 듯,’나’의 추측)
-
메모리를 2배로 사용한다.
- : ‘Redis’ 는 Single-Thread 이고, SnapShot 을 뜰 때, 자식 프로세스를 하나 만들어 낸 후, 새로 변경된 메모리 페이지를 복사해서 사용한다.
-
‘copy and write’ 방식을 사용하고 있지만, 보통 ‘Redis’를 사용할 때는 데이터 변경이 잦기 때문에 실제 메모리 양 만큼의 메모리를 자식 프로세스가 복사하게 된다.
=> 그래서 실제로 필요한 메모리 양 보다 더 많은 메모리를 사용하게 된다.
Memcached 의 장점
-
DB /API 통신을 줄이기 위해 데이터를 캐싱 처리하는 데에 사용하면 좋은 캐시이다.
-
‘Redis’ 는 트래픽이 몰리면, 응답속도가 불안정하다고 한다. 하지만 ‘Memcached’ 는 트래픽이 몰려도 응답 속도는 안정적인 편이라고 한다.
-
내부적으로 slab 할당자를 사용하고 있어서, 메모리 할당이 잦지 않다. (‘Redis’는 jemalloc -> 메모리 fragmentation 발생)
: ‘다만 이는 극단적인 경우를 고려하였을 때의 경우이며, 대규모 서비스에도 ‘Redis’ 를 적용하는 사례가 많으며 스타트업 등에서 사용하기에는 거의 문제가 없다고 본다’ 라고 한다.
jemalloc 메모리 할당자.
- : ‘제이슨 에반스’가 FreeBSD 의 메모리 할당 성능을 개선하기 위해서 만든 메모리 할당자 이다.
-
메모리 할당/해체를 많이 하는 프로그램에서는, 메모리 할당자를 jemalloc으로 바꾸는 것 만으로도 성능을 10~20% 향상 할 수 있다.