Redis가 캐싱에서 Memcached를 능가하는 이유

Memcached 또는 Redis? 현대의 데이터베이스 기반 웹 애플리케이션에서 더 많은 성능을 끌어내는 것에 대한 모든 논의에서 거의 항상 발생하는 질문입니다. 성능을 개선해야하는 경우 캐싱은 종종 첫 번째 단계이며 일반적으로 Memcached 또는 Redis가 가장 먼저 전환됩니다.

이러한 유명한 캐시 엔진은 여러 유사점을 공유하지만 중요한 차이점도 있습니다. 둘 중 더 새롭고 다재다능한 Redis는 거의 항상 우수한 선택입니다.

캐싱을위한 Redis 대 Memcached

유사점부터 시작하겠습니다. Memcached와 Redis는 모두 메모리 내 키-값 데이터 저장소 역할을하지만 Redis는 데이터 구조 저장소로 더 정확하게 설명됩니다. Memcached와 Redis는 모두 NoSQL 데이터 관리 솔루션 제품군에 속하며 둘 다 키-값 데이터 모델을 기반으로합니다. 둘 다 모든 데이터를 RAM에 보관하므로 캐싱 레이어로 매우 유용합니다. 성능 측면에서도 두 데이터 저장소는 매우 유사하여 처리량 및 지연 시간과 관련하여 거의 동일한 특성 (및 메트릭)을 나타냅니다.

Memcached와 Redis는 모두 성숙하고 매우 인기있는 오픈 소스 프로젝트입니다. Memcached는 원래 LiveJournal 웹 사이트를 위해 Brad Fitzpatrick이 2003 년에 개발했습니다. 그 이후로 Memcached는 C (원래 구현은 Perl에 있음)로 다시 작성되었으며 공용 도메인에 배치되어 최신 웹 애플리케이션의 초석이되었습니다. Memcached의 현재 개발은 새로운 기능을 추가하는 대신 안정성과 최적화에 중점을 둡니다.

Redis는 2009 년 Salvatore Sanfilippo에 의해 만들어졌으며 Sanfilippo는 현재 프로젝트의 수석 개발자로 남아 있습니다. Redis는 때때로 "Memcached on steroids"로 묘사되는데, Redis의 일부가 Memcached를 사용하여 얻은 교훈에 따라 구축되었다는 점을 고려하면 놀랄 일이 아닙니다. Redis는 Memcached보다 더 많은 기능을 가지고 있으므로 더 강력하고 유연합니다.

많은 회사와 수많은 미션 크리티컬 프로덕션 환경에서 사용되는 Memcached와 Redis는 가능한 모든 프로그래밍 언어의 클라이언트 라이브러리에서 지원되며 개발자를위한 다양한 패키지에 포함되어 있습니다. 실제로 Memcached 또는 Redis에 대한 기본 지원을 포함하지 않는 드문 웹 스택입니다.

Memcached와 Redis가 그토록 인기있는 이유는 무엇입니까? 매우 효과적 일뿐만 아니라 상대적으로 간단합니다. Memcached 또는 Redis를 시작하는 것은 개발자에게 쉬운 작업으로 간주됩니다. 애플리케이션을 설정하고 작업하는 데 몇 분 밖에 걸리지 않습니다. 따라서 약간의 시간과 노력을 투자해도 성능에 즉각적이고 극적인 영향을 미칠 수 있습니다 (대개 수십 배 정도). 큰 이점이있는 간단한 솔루션입니다. 그것은 당신이 얻을 수있는 한 마법에 가깝습니다.

Memcached를 사용하는 경우

Memcached는 HTML 코드 조각과 같이 상대적으로 작고 정적 인 데이터를 캐싱 할 때 선호 될 수 있습니다. Memcached의 내부 메모리 관리는 Redis만큼 정교하지는 않지만 메타 데이터에 상대적으로 적은 메모리 리소스를 사용하기 때문에 가장 간단한 사용 사례에서 더 효율적입니다. 문자열 (Memcached에서 지원하는 유일한 데이터 유형)은 추가 처리가 필요하지 않으므로 읽기 전용 데이터를 저장하는 데 이상적입니다.

대용량 데이터 세트에는 직렬화 된 데이터가 포함되는 경우가 많으므로 항상 더 많은 공간을 저장해야합니다. Memcached는 데이터를 직렬화 된 형식으로 저장하는 것으로 효과적으로 제한되지만 Redis의 데이터 구조는 기본적으로 데이터의 모든 측면을 저장할 수 있으므로 직렬화 오버 헤드를 줄일 수 있습니다.

Memcached가 Redis보다 유리한 두 번째 시나리오는 확장입니다. Memcached는 다중 스레드이기 때문에 더 많은 계산 리소스를 제공하여 쉽게 확장 할 수 있지만 일관된 해싱을 사용하는지 여부에 따라 캐시 된 데이터의 일부 또는 전체를 잃게됩니다. 대부분 단일 스레드 인 Redis는 데이터 손실없이 클러스터링을 통해 수평 적으로 확장 할 수 있습니다. 클러스터링은 효과적인 확장 솔루션이지만 설정 및 운영이 비교적 복잡합니다.

Redis를 사용하는 경우

데이터 구조 때문에 거의 항상 Redis를 사용하고 싶을 것입니다. Redis를 캐시로 사용하면 많은 성능 (예 : 캐시 콘텐츠 및 내구성을 미세 조정하는 기능)과 전반적인 효율성이 향상됩니다. 데이터 구조를 사용하면 특정 애플리케이션 시나리오에서 효율성이 엄청나게 향상됩니다.

Redis의 우월성은 캐시 관리의 거의 모든 측면에서 분명합니다. 캐시는 데이터 제거라는 메커니즘을 사용하여 메모리에서 오래된 데이터를 삭제하여 새 데이터를위한 공간을 만듭니다. Memcached의 데이터 제거 메커니즘은 최소 최근 사용 알고리즘을 사용하며 크기가 새 데이터와 비슷한 데이터를 임의로 제거합니다.

반대로 Redis는 제거에 대한 세밀한 제어를 허용하므로 6 가지 다른 제거 정책 중에서 선택할 수 있습니다. Redis는 또한 메모리 관리 및 제거 후보 선택에보다 정교한 접근 방식을 사용합니다. Redis는 더 많은 공간이 필요하거나 사전 예방 적으로 데이터가 제거되는 지연 및 활성 제거를 모두 지원합니다. 

Redis는 캐시 할 수있는 개체에 대해 훨씬 더 큰 유연성을 제공합니다. Memcached는 키 이름을 250 바이트로 제한하고 일반 문자열로만 작동하지만 Redis는 키 이름과 값을 각각 512MB까지 허용하며 바이너리 안전합니다. 또한 Redis에는 선택할 수있는 5 가지 기본 데이터 구조가있어 지능형 캐싱 및 캐시 된 데이터 조작을 통해 애플리케이션 개발자에게 가능성의 세계를 열어줍니다.

데이터 지속성을위한 Redis

Redis 데이터 구조를 사용하면 캐싱하는 동안뿐만 아니라 데이터가 지속적이고 항상 사용 가능하도록하려는 경우에도 여러 작업을 단순화하고 최적화 할 수 있습니다. 예를 들어, 개발자는 객체를 직렬화 된 문자열로 저장하는 대신 Redis Hash를 사용하여 객체의 필드와 값을 저장하고 단일 키를 사용하여 관리 할 수 ​​있습니다. Redis Hash는 개발자가 전체 문자열을 가져 와서 역 직렬화하고, 값을 업데이트하고, 객체를 재 직렬화하고, 모든 사소한 업데이트에 대해 캐시의 전체 문자열을 새 값으로 교체해야하는 필요성을 줄여줍니다. 즉, 리소스 소비가 줄어들고 성능이 향상됩니다.

Redis에서 제공하는 다른 데이터 구조 (예 : 목록, 집합, 정렬 된 집합, 하이퍼 로그 로그, 비트 맵 및 지리 공간 인덱스)를 사용하여 훨씬 더 복잡한 시나리오를 구현할 수 있습니다. 시계열 데이터 수집 및 분석을위한 정렬 된 집합은 대폭 감소 된 복잡성과 낮은 대역폭 소비를 제공하는 Redis 데이터 구조의 또 다른 예입니다.

Redis의 또 다른 중요한 장점은 저장하는 데이터가 불투명하지 않아 서버가 직접 조작 할 수 있다는 것입니다. Redis에서 사용할 수있는 180 개 이상의 명령 중 상당 부분은 데이터 처리 작업 및 서버 측 Lua 스크립팅을 통해 데이터 저장소 자체에 논리를 포함하는 데 사용됩니다. 이러한 기본 제공 명령 및 사용자 스크립트는 처리를 위해 네트워크를 통해 다른 시스템으로 데이터를 전달하지 않고도 Redis에서 직접 데이터 처리 작업을 처리 할 수있는 유연성을 제공합니다.

Redis는 계획된 종료 또는 계획되지 않은 실패 후 캐시를 부트 스트랩하도록 설계된 조정 가능한 선택적 데이터 지속성을 제공합니다. 캐시의 데이터는 일시적이고 일시적인 것으로 간주하는 경향이 있지만 데이터를 디스크에 저장하는 것은 캐싱 시나리오에서 매우 가치가있을 수 있습니다. 재시작 직후에 캐시 데이터를로드 할 수 있도록하면 캐시 준비 시간을 훨씬 단축하고 기본 데이터 저장소에서 캐시 콘텐츠를 다시 채우고 다시 계산하는 데 관련된로드를 제거 할 수 있습니다.

Redis 인 메모리 데이터 복제 

Redis는 관리하는 데이터를 복제 할 수도 있습니다. 복제는 장애를 견딜 수 있고 애플리케이션에 중단없는 서비스를 제공 할 수있는 고 가용성 캐시 설정을 구현하는 데 사용할 수 있습니다. 캐시 오류는 사용자 경험과 애플리케이션 성능에 미치는 영향 측면에서 애플리케이션 오류에 약간 못 미칩니다. 따라서 대부분의 경우 캐시의 콘텐츠와 서비스 가용성을 보장하는 검증 된 솔루션을 보유하는 것이 주요 이점입니다.

마지막으로 운영 가시성 측면에서 Redis는 사용 및 비정상 동작을 모니터링하고 추적하는 데 사용할 수있는 수많은 메트릭과 풍부한 내성 명령을 제공합니다. 데이터베이스의 모든 측면에 대한 실시간 통계, 실행중인 모든 명령의 표시, 클라이언트 연결의 나열 및 관리 —Redis에는 모든 것이 있습니다.

개발자가 Redis의 지속성 및 메모리 내 복제 기능의 효과를 인식하면 일반적으로 고속 데이터를 분석 및 처리하고 보조 (종종 더 느린) 데이터베이스가 유지 관리하는 동안 사용자에게 응답을 제공하기 위해이를 첫 번째 응답 데이터베이스로 사용합니다. 일어난 일의 역사적 기록. 이러한 방식으로 사용하면 Redis는 분석 사용 사례에도 이상적 일 수 있습니다.

데이터 분석을위한 Redis

세 가지 분석 시나리오가 즉시 떠 오릅니다. 첫 번째 시나리오에서 Apache Spark와 같은 것을 사용하여 대규모 데이터 세트를 반복적으로 처리 할 때 Redis를 이전에 Spark에서 계산 한 데이터의 제공 레이어로 사용할 수 있습니다. 두 번째 시나리오에서 Redis를 메모리 내 공유 분산 데이터 저장소로 사용하면 Spark 처리 속도를 45 ~ 100 배까지 가속화 할 수 있습니다. 마지막으로 너무 일반적인 시나리오는 보고서 및 분석을 다음과 같이 사용자 정의 할 수 있어야하는 시나리오입니다. 사용자가 기본적으로 배치 데이터 저장소 (예 : Hadoop 또는 RDBMS)에서 데이터를 검색하는 데 너무 오래 걸립니다. 이 경우 Redis와 같은 인 메모리 데이터 구조 저장소는 밀리 초 미만의 페이징 및 응답 시간을 얻는 유일한 실용적인 방법입니다.

매우 큰 운영 데이터 세트 또는 분석 워크로드를 사용하는 경우 모든 것을 메모리 내에서 실행하는 것이 비용 효율적이지 않을 수 있습니다. 낮은 비용으로 밀리 초 미만의 성능을 달성하기 위해 Redis Labs는 RAM과 플래시의 조합에서 실행되는 Redis 버전을 만들었으며 RAM 대 플래시 비율을 구성하는 옵션을 제공했습니다. 이를 통해 워크로드 처리를 가속화 할 수있는 몇 가지 새로운 방법이 열리지 만 개발자는 "플래시에서 캐시"를 간단히 실행할 수있는 옵션도 제공합니다.

오픈 소스 소프트웨어는 오늘날 이용 가능한 최고의 기술을 계속해서 제공하고 있습니다. 캐싱을 통한 애플리케이션 성능 향상과 관련하여 Redis와 Memcached는 가장 잘 확립되고 프로덕션에서 입증 된 후보입니다. 그러나 Redis의 풍부한 기능, 고급 디자인, 많은 잠재적 용도 및 대규모 비용 효율성을 고려할 때 Redis는 거의 모든 경우에 가장 먼저 선택해야합니다.

---

Itamar Haber (@itamarhaber)는 개발자를위한 완전 관리 형 클라우드 서비스로 Memcached 및 Redis를 제공하는 Redis Labs의 수석 개발자 지지자입니다. 그의 다양한 경험에는 Xeround, Etagon, Amicada 및 MNS Ltd의 소프트웨어 제품 개발 및 관리 및 리더십 역할이 포함됩니다. Itamar는 Northwestern 및 Tel-Aviv 대학의 공동 Kellogg-Recanati 프로그램에서 경영학 석사 및 학사 학위를 받았습니다. 컴퓨터 과학의 과학.

New Tech Forum은 새로운 엔터프라이즈 기술을 전례없이 깊이 있고 폭넓게 탐구하고 논의 할 수있는 장을 제공합니다. 선택은 우리가 중요하고 독자들에게 가장 큰 관심을 가지고 있다고 생각하는 기술을 선택하여 주관적입니다. 는 게시를위한 마케팅 자료를 허용하지 않으며 제공되는 모든 콘텐츠를 편집 할 권리를 보유합니다. 모든 문의 사항은 [email protected]으로 보내주십시오.