Redis или Memcached, что лучше для кэширования?

Андрей Васенин

Андрей Васенин

Автор статьи. Сфера интересов: ИТ-специалист (программирование, администрирование, DBA). Кандидат экономических наук. Подробнее .

Memcached или Redis какой кэш лучше?Memcached иногда более эффективен, но Redis - почти всегда лучший выбор

 Memcached или Redis? Это вопрос, который почти всегда возникает в любой дискуссии о достижении большей производительности в современных веб-приложениях, управляемых базами данных. Когда производительность должна быть улучшена, кэширование часто является первым шагом такой оптимизации, и Memcached или Redis, как правило, являются первыми претендентами в списке программистов и администраторов.

 Эти известные механизмы кэширования имеют ряд сходств, но они также имеют важные отличия. Redis, новый и более универсальный из двух, почти всегда является лучшим выбором.

 

 Redis против Memcached для кеширования данных

 Начнем со сходств. И Memcached, и Redis служат в качестве размещающихся в оперативной памяти хранилищ данных с ключом, хотя Redis более точно описывается как хранилище структуры данных. Как Memcached, так и Redis относятся к семейству решений для управления данными NoSQL, и оба они основаны на модели данных с ключевыми значениями. Они сохраняют все данные в ОЗУ (памяти), что, конечно же, делает их чрезвычайно полезными в качестве слоя кеширования. С точки зрения производительности два хранилища данных также очень похожи, демонстрируя почти идентичные характеристики (и показатели) в отношении пропускной способности и латентности.

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

Redis был создан программистом Салваторе Санфилиппо (Salvatore Sanfilippo) в 2009 году, и он остается ведущим разработчиком проекта сегодня. Redis иногда описывается как «Memcached на стероидах», что неудивительно с учетом того, что части кода Redis были построены в ответ на уроки, извлеченные из использования Memcached. Redis имеет больше возможностей, чем Memcached, и, таким образом, более мощный и гибкий.

Используемые многими компаниями и в бесчисленных критически важных производственных средах, Memcached и Redis поддерживаются клиентскими библиотеками на всех мыслимых языках программирования и включаются в множество пакетов для разработчиков. Фактически, это редкий веб-стек, который не включает встроенную поддержку для Memcached или Redis.

 

Почему Memcached и Redis так популярны? Они не только чрезвычайно эффективны, но и относительно просты. Начало работы с Memcached или Redis считается простой работой для разработчика. Требуется всего несколько минут, чтобы настроить и заставить их работать с приложением. Таким образом, небольшая инвестиция времени и усилий может иметь непосредственное и внушительное влияние на производительность - обычно на порядок. Простое решение с огромной выгодой; это так близко к магии, которой вы можете с легкостью воспользоваться.

 

Когда использовать Memcached

 Поскольку Redis новее и имеет больше возможностей, чем Memcached, Redis почти всегда лучший выбор. Тем не менее, Memcached может быть предпочтительнее при кэшировании относительно небольших и статических данных, таких как фрагменты кода HTML. Управление внутренней памятью Memcached, хотя и не столь сложное, как решение Redis, более эффективно в простейших случаях использования, поскольку оно потребляет сравнительно меньше ресурсов памяти для метаданных. Строки (единственный тип данных, поддерживаемый Memcached) идеально подходят для хранения данных, которые только читаются, потому что строки не требуют дальнейшей обработки.

 Тем не менее, эффективность управления памятью Memcached быстро уменьшается, когда размер данных является динамическим, после чего память Memcached может стать фрагментированной. Кроме того, большие наборы данных часто включают в себя сериализованные данные, которые всегда требуют большего пространства для хранения. Хотя Memcached эффективно ограничивается хранением данных в его сериализованной форме, структуры данных в Redis могут сохранять любой аспект данных изначально, тем самым уменьшая накладные расходы на сериализацию.

 Второй сценарий, в котором Memcached имеет преимущество перед Redis, находится в масштабировании. Поскольку Memcached многопоточен, вы можете легко увеличить его, предоставив ему больше вычислительных ресурсов, но вы потеряете часть или все кэшированные данные (в зависимости от того, используете ли вы постоянное хеширование). Redis, который в основном однопоточный, может масштабироваться горизонтально посредством кластеризации без потери данных. Кластеризация представляет собой эффективное масштабирующее решение, но его сравнительно сложно создавать и управлять им.

 

Когда использовать Redis

Вам почти всегда придётся использовать Redis из-за своих структур данных. С Redis в качестве кеша вы получаете богатый функционал (например, возможность тонкой настройки содержимого кеша и долговечность) и бОльшую эффективность в целом. Как только вы используете структуры данных, повышение эффективности становится огромным для конкретных сценариев приложений.

Превосходство Redis проявляется почти во всех аспектах управления кешем. Кэши используют механизм, называемый выселением данных (синоним: вытеснение данных), чтобы освободить место для новых данных, удалив старые данные из памяти. Механизм выселения данных Memcached использует алгоритм Least Recent Used (LRU) и несколько произвольно вытесняет данные, похожие по размеру на новые данные.

Redis, напротив, позволяет осуществлять мелкомасштабный контроль за выселением, позволяя вам выбирать из шести различных политик выселения. Redis также использует более сложные подходы к управлению памятью и выбору кандидата на выселение. Redis поддерживает как пассивное, так и активное выселение, когда данные вытесняются только тогда, когда требуется больше места или применяется упреждающее вытеснение. Memcached, с другой стороны, обеспечивает пассивное выселение.

 Redis дает вам большую гибкость в отношении объектов, которые вы можете кэшировать. Хотя Memcached ограничивает имена ключей до 250 байтов и работает только с обычными строками, Redis позволяет имена и значения ключей размером до 512 Мбайт каждый, и они могут быть бинарными. Кроме того, Redis имеет пять основных структур данных на выбор, открывая миру возможности для разработчика приложений посредством интеллектуального кэширования и манипулирования кэшированными данными.

 

Redis для сохранения данных

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

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

Другим важным преимуществом Redis является то, что хранящиеся в нем данные не являются непрозрачными, поэтому сервер может манипулировать ими напрямую. Значительная доля команд (более 180), доступных в Redis, обращена к операциям обработки данных и логике внедрения в самом хранилище данных с помощью сценариев Lua на стороне сервера. Эти встроенные команды и пользовательские скрипты дают вам гибкость в решении задач обработки данных непосредственно в Redis без переноса данных по сети в другую систему для обработки.

 Redis предлагает опциональную и настраиваемую постоянную сохранность данных, предназначенную для загрузки кэша после запланированного отключения или незапланированного сбоя. Хотя мы склонны рассматривать данные в кэшах как изменчивые и временные, сохраняющиеся данные на диске могут быть весьма полезными в сценариях кэширования. Наличие данных кэша, доступных для загрузки сразу после перезапуска, позволяет значительно сократить время «прогрева» кеша и удаляет нагрузку, связанную с повторной платой за пересчитывание содержимого кеша из первичного хранилища данных.

 

Redis для репликации данных в памяти

Redis также может копировать данные, которыми он управляет. Репликация может использоваться для реализации высокодоступной настройки кеша, которая может противостоять сбоям и обеспечивать бесперебойное обслуживание приложения. Сбой кэша падает лишь незначительно, если не считать неудачи приложений с точки зрения влияния на пользовательский опыт и производительность приложения, поэтому наличие надежного решения, гарантирующего достоверность и доступность кеша, является главным преимуществом в большинстве случаев.

И последнее, но не менее важное: с точки зрения оперативной видимости Redis обеспечивает множество показателей и множество интроспективных команд, с помощью которых можно мониторить и отслеживать использование кэша и ненормальное поведение. Статистика в реальном времени по каждому аспекту базы данных, отображение всех выполняемых команд, листинг и управление клиентскими соединениями - у Redis есть все это и многое другое.

Когда программисты осознают эффективность Redis и возможности репликации в памяти, они часто используют его как базу данных с первым ответчиком, как правило, для анализа и обработки высокоскоростных данных и предоставления ответов пользователю, в то время как вторичная (часто более медленная) база данных поддерживает исторический отчет о том, что произошло. При использовании таким образом Redis также может быть идеальным для случаев использования в сфере оперативной аналитики.

 

Redis для анализа данных

Три сценария аналитики сразу приходят в голову. В первом сценарии при использовании чего-то типа Apache Spark: для итеративной обработки больших наборов данных вы можете использовать Redis в качестве обслуживающего слоя для данных, предварительно рассчитанных Spark. Во втором случае использование Redis в качестве общего хранилища распределенных данных в памяти может ускорить скорость обработки Spark в 45-100 раз. Наконец, самый распространенный сценарий - это тот, в котором отчеты и аналитика должны настраиваться посредством пользователь, но получение данных из встроенных хранилищ данных пакетов (например, Hadoop или RDBMS) занимает слишком много времени. В этом случае хранилище данных в памяти, такое как Redis, является единственным практичным способом получения микромиллисекундного времени подкачки и времени ответа!

При использовании чрезвычайно больших наборов операционных данных или аналитических нагрузок работа по всему внутри памяти может оказаться неэффективной. Чтобы достичь производительности в миллисекундах при меньших затратах, Redis Labs создала версию Redis, которая работает на комбинации оперативной памяти и флэш-памяти, с возможностью настройки коэффициентов RAM-to-flash. Хотя это открывает несколько новых возможностей для ускорения обработки рабочей нагрузки, это также дает разработчикам возможность просто запускать свой «кеш на flash».

Программное обеспечение с открытым исходным кодом продолжает предоставлять одни из лучших технологий, доступных сегодня. Когда дело доходит до повышения производительности приложений посредством кэширования, Redis и Memcached являются наиболее известными и проверенными на практических проектах кандидатами. Однако, учитывая богатую функциональность Redis, более продвинутый дизайн, много потенциальных применений и сравнительно большую экономическую эффективность, Redis должен быть вашим безоговорочным выбором практически в каждом случае.

Вас заинтересует / Intresting for you:

Что такое PostgreSQL? Плюсы и ...
Что такое PostgreSQL? Плюсы и ... 12718 просмотров Ирина Светлова Tue, 06 Feb 2018, 07:41:15
Реляционная модель и проектиро...
Реляционная модель и проектиро... 2427 просмотров Ирина Светлова Tue, 21 Nov 2017, 13:27:29
Проектирование таблиц для базы...
Проектирование таблиц для базы... 9154 просмотров Дэйзи ак-Макарова Sat, 24 Mar 2018, 16:23:55
Джеймс Форгн (James Forgy) - с...
Джеймс Форгн (James Forgy) - с... 4567 просмотров Antoni Sun, 05 Aug 2018, 16:21:01
Войдите чтобы комментировать

anders7777 аватар
anders7777 ответил в теме #9480 01 окт 2019 07:01

Doc пишет: Redis - да! Хотя с Apv сложно не согласиться, - все определяется КОНКРЕТНОЙ задачей!

Оно да, но в некоторых случаях Memcached действительно отрабатывает лучше. Иначе бы проект давно бы уже закрылся, ан нет.. продукт продолжают использовать!
Doc аватар
Doc ответил в теме #9262 17 окт 2018 10:47
Redis - да! Хотя с Apv сложно не согласиться, - все определяется КОНКРЕТНОЙ задачей!
apv аватар
apv ответил в теме #8687 18 сен 2017 15:20
Смотреть, конечно, по задаче нужно, но в целом Рэдис лидер сегодня.
ildergun аватар
ildergun ответил в теме #8684 17 сен 2017 11:38
Исчерпывающая статья, спасибо Автору! Долго метался в выборе между Memcached и Redis, а теперь сомнений нет. Навалюсь со всей яростью на установку и настройку Redis на своем веб-сервере!)))