Защо Redis бие Memcached за кеширане

Memcached или Redis? Това е въпрос, който почти винаги възниква при всяка дискусия относно изтласкването на повече производителност от съвременното уеб-приложение, управлявано от бази данни. Когато трябва да се подобри производителността, кеширането често е първата предприета стъпка, а Memcached или Redis обикновено са първите места за обръщане.

Тези известни кеш машини споделят редица прилики, но имат и важни разлики. Redis, по-новият и по-гъвкав от двете, е почти винаги превъзходният избор.

Redis срещу Memcached за кеширане

Нека започнем с приликите. Както Memcached, така и Redis служат като хранилища за данни в паметта, ключ-стойност, въпреки че Redis е по-точно описан като хранилище за структура на данни. Както Memcached, така и Redis принадлежат към семейството на NoSQL решения за управление на данни и и двете са базирани на модел на данни ключ-стойност. И двамата пазят всички данни в RAM, което, разбира се, ги прави изключително полезни като кеширащ слой. По отношение на производителността, двете хранилища на данни също са изключително сходни, показвайки почти идентични характеристики (и показатели) по отношение на производителността и латентността.

Както Memcached, така и Redis са зрели и изключително популярни проекти с отворен код. Memcached първоначално е разработен от Брад Фицпатрик през 2003 г. за уебсайта на LiveJournal. Оттогава Memcached е пренаписан на C (първоначалната реализация е в Perl) и е поставен в публичното пространство, където се е превърнал в крайъгълен камък на съвременните уеб приложения. Текущото развитие на Memcached е фокусирано върху стабилността и оптимизациите, а не върху добавянето на нови функции.

Redis е създаден от Salvatore Sanfilippo през 2009 г., а Sanfilippo остава водещ разработчик на проекта днес. Redis понякога се описва като „Memcached на стероиди“, което едва ли е изненадващо, като се има предвид, че части от 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, за разлика от това, позволява фино контролиран контрол върху изселването, като ви позволява да избирате измежду шест различни политики за изселване. Redis също така използва по-сложни подходи за управление на паметта и избор на кандидати за изселване. Redis поддържа както мързеливо, така и активно изселване, при което данните се изхвърлят само когато е необходимо повече място или активно. 

Redis ви дава много по-голяма гъвкавост по отношение на обектите, които можете да кеширате. Докато Memcached ограничава имената на ключове до 250 байта и работи само с обикновени низове, Redis позволява имената на ключовете и стойностите да бъдат по-големи от 512MB всеки и те са двоични. Освен това Redis има пет основни структури от данни, от които да избирате, отваряйки свят на възможности за разработчика на приложения чрез интелигентно кеширане и манипулиране на кеширани данни.

Redis за постоянство на данните

Използването на структури от данни на Redis може да опрости и оптимизира няколко задачи - не само по време на кеширане, но дори когато искате данните да бъдат постоянни и винаги достъпни. Например, вместо да съхраняват обекти като сериализирани низове, разработчиците могат да използват Redis Hash за съхраняване на полета и стойности на обект и да ги управляват с помощта на един ключ. Redis Hash спестява на разработчиците необходимостта да извлекат целия низ, да го десериализират, да актуализират стойност, да повториализират обекта и да заменят целия низ в кеша с новата му стойност за всяка тривиална актуализация - това означава по-ниска консумация на ресурси и повишена производителност.

Други структури от данни, предлагани от Redis (като списъци, набори, сортирани набори, хиперлогове, растерни изображения и геопространствени индекси), могат да бъдат използвани за реализиране на още по-сложни сценарии. Сортираните набори за поглъщане и анализ на данни от времеви редове са друг пример за структура на данни на Redis, която предлага изключително намалена сложност и по-ниска консумация на честотна лента.

Друго важно предимство на Redis е, че данните, които съхранява, не са непрозрачни, така че сървърът може да ги манипулира директно. Значителен дял от над 180 команди, налични в Redis, са посветени на операции по обработка на данни и вграждане на логика в самото хранилище на данни чрез скриптове на Lua от страна на сървъра. Тези вградени команди и потребителски скриптове ви дават гъвкавост при работа с задачи за обработка на данни директно в Redis, без да се налага да изпращате данни през мрежата към друга система за обработка.

Redis предлага опционално и регулируемо съхранение на данни, предназначено да зареди кеша след планирано изключване или непланирана повреда. Въпреки че сме склонни да разглеждаме данните в кеша като нестабилни и преходни, постоянните данни на диск могат да бъдат доста ценни в сценариите за кеширане. Наличието на данните в кеша за зареждане веднага след рестартиране позволява много по-кратко загряване на кеша и премахва натоварването, свързано с повторно попълване и преизчисляване на съдържанието на кеша от първичното хранилище на данни.

Повторно репликиране на данни в паметта 

Redis може също да репликира данните, които управлява. Репликацията може да се използва за внедряване на високодостъпна настройка на кеша, която може да издържи неуспехи и да осигури непрекъсната услуга на приложението. Неуспехът на кеша е малко по-кратък от неуспеха на приложението по отношение на въздействието върху потребителския опит и производителността на приложението, така че наличието на доказано решение, което гарантира съдържанието на кеша и наличността на услугата, е основно предимство в повечето случаи.

Не на последно място, що се отнася до оперативната видимост, Redis предоставя множество показатели и богатство от интроспективни команди, с които да следи и проследява употребата и ненормалното поведение. Статистика в реално време за всеки аспект на базата данни, показване на всички изпълнявани команди, изброяване и управление на клиентски връзки - Redis има всичко това и още.

Когато разработчиците осъзнаят ефективността на устойчивостта на Redis и възможностите за репликация в паметта, те често я използват като база данни с първи отговор, обикновено за анализ и обработка на данни с висока скорост и предоставяне на отговори на потребителя, докато вторична (често по-бавна) база данни поддържа исторически запис на случилото се. Когато се използва по този начин, Redis може да бъде идеален и за случаи на използване на анализи.

Redis за анализ на данни

Три сценария за анализ идват веднага на ум. В първия сценарий, когато използвате нещо като Apache Spark за итеративна обработка на големи масиви от данни, можете да използвате Redis като обслужващ слой за данни, изчислени преди това от Spark. Във втория сценарий използването на Redis като вашето споделено, в паметта разпределено хранилище на данни може да ускори скоростите на обработка на Spark с коефициент от 45 до 100. И накрая, твърде често срещаният сценарий е този, при който отчетите и анализите трябва да се персонализират от потребителя, но извличането на данни от съхранени по същество пакетни данни (като Hadoop или RDBMS) отнема твърде много време. В този случай хранилището на структурата на данните в паметта, като Redis, е единственият практичен начин за получаване на подмилисекундно пейджинг и време за реакция.

Когато използвате изключително големи набори от оперативни данни или натоварвания за анализ, стартирането на всичко в паметта може да не е рентабилно. За да постигне производителност под милисекунди на по-ниска цена, Redis Labs създаде версия на Redis, която работи на комбинация от RAM и флаш, с опцията за конфигуриране на съотношенията RAM и flash. Въпреки че това отваря няколко нови пътя за ускоряване на обработката на работното натоварване, той също така дава възможност на разработчиците просто да стартират своя „кеш на флаш“.

Софтуерът с отворен код продължава да предоставя едни от най-добрите технологии, налични днес. Що се отнася до повишаване на производителността на приложенията чрез кеширане, Redis и Memcached са най-утвърдените и доказани в производството кандидати. Въпреки това, като се има предвид по-богатата функционалност на Redis, по-усъвършенстваният дизайн, много потенциални приложения и по-голяма ефективност на разходите в мащаб, Redis трябва да бъде вашият първи избор в почти всеки случай.

---

Itamar Haber (@itamarhaber) е главен защитник на разработчиците в Redis Labs, който предлага Memcached и Redis като напълно управлявани облачни услуги за разработчици. Разнообразният му опит включва разработка и управление на софтуерни продукти и ръководни роли в Xeround, Etagon, Amicada и MNS Ltd. на компютърните науки.

Форумът New Tech предоставя място за изследване и обсъждане на нововъзникващите корпоративни технологии в безпрецедентна дълбочина и широчина. Изборът е субективен, базиран на нашия избор на технологиите, които смятаме, че са важни и представляват най-голям интерес за читателите. не приема маркетингово обезпечение за публикуване и си запазва правото да редактира цялото съдържание. Изпращайте всички запитвания на [email protected]