Memcached против Redis?


мы используем веб-приложение Ruby с Redis сервер для кэширования. Есть ли смысл проверить Memcached вместо?

Что даст нам лучшую производительность? Любые плюсы или минусы между Redis и Memcached?

нюансы:

  • скорость чтения/записи.
  • использование памяти.
  • сброс дискового ввода-вывода.
  • масштабирование.
17 1171

17 ответов:

резюме (TL;DR)

Обновлено 3 июня 2017 года

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

для чего-нибудь нового, используйте Redis.

Memcached vs Redis: прямое сравнение

оба инструмента являются мощными, быстрыми, в памяти хранилищ данных, которые полезны в качестве кэша. Оба может помочь ускорить работу приложения путем кэширования результатов базы данных, фрагментов HTML или чего-либо еще, что может быть дорого для создания.

моменты

при использовании для того же самого, вот как они сравнивают, используя исходные вопросы "точки для рассмотрения":

  • скорость чтения/записи: оба очень быстро. Бенчмарки различаются по рабочей нагрузке, версиям и многим другим факторам, но обычно показывают, что redis работает так же быстро или почти так же быстро, как из memcached. Я рекомендую redis, но не потому, что memcached медленный. Это не так.
  • использование памяти: Redis-это лучше.
    • memcached: вы указываете размер кэша, и по мере вставки элементов демон быстро растет до немного большего размера. Никогда не существует способа вернуть какое-либо из этого пространства, кроме перезапуска memcached. Все ваши ключи могут быть просрочены, вы можете очистить базу данных, и она все равно будет использовать полный кусок ОЗУ настроил его с.
    • redis: установка максимального размера зависит от вас. Redis никогда не будет использовать больше, чем нужно, и вернет вам память, которую он больше не использует.
    • я сохранил 100 000 ~ 2kb строк (~200 МБ) случайных предложений в обоих. Использование Memcached RAM выросло до ~225 МБ. Использование Redis RAM выросло до ~228 МБ. После промывки обоих, redis упал до ~29 мб, а memcached остался на ~225 МБ. Они одинаково эффективны в том, как они хранят данные, но только один способен вернуть оно.
  • дисковый ввод-вывод: явный выигрыш для redis, так как он делает это по умолчанию и имеет очень настраиваемую стойкость. Memcached не имеет механизмов для сброса на диск без сторонних инструментов.
  • масштабирование: оба дают вам тонны запас, прежде чем вам нужно больше, чем один экземпляр в качестве кэша. Redis включает в себя инструменты, которые помогут вам выйти за рамки этого, в то время как memcached делает не.

memcached

Memcached-это простой сервер Летучего кэша. Он позволяет хранить пары ключ / значение, где значение ограничено строкой до 1 МБ.

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

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

Если вам нужна высокая производительность или высокая доступность, есть сторонние инструменты, продукты и услуги.

Рэдис

Redis может выполнять те же задания, что и memcached, и может делать их лучше.

Redis может действовать как кэш как хорошо. Он может хранить пары ключ/значение. В redis они могут быть даже до 512 МБ.

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

это тоже очень быстро, часто ограничено пропускной способностью сети или памяти.

если одного экземпляра redis/memcached недостаточно для вашей рабочей нагрузки, redis является четким выбором. Redis включает в себя поддержка кластеров и поставляется с высокой доступности (направле-Сентинел) прямо "в поле". За последние несколько лет редис также появился как явный лидер в 3-й партии инструментов. Такие компании, как Redis Labs, Amazon и другие, предлагают множество полезных инструментов и услуг redis. Экосистема вокруг редиса намного больше. Количество крупномасштабных развертываний теперь, вероятно, больше, чем для memcached.

Суперсет Redis

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

документация

Redis лучше документирован, чем memcached. Хотя это может быть субъективным, это кажется все более и более истинным все время.

redis.io это фантастический легко перемещаемый ресурс. Это позволяет вам попробуйте redis в браузере и даже дает вам живые интерактивные примеры с каждой командой в документах.

там теперь в 2 раза больше результатов stackoverflow для redis, чем memcached. 2x как много результатов Google. Более легкодоступные примеры на большем количестве языков. Более активное развитие. Более активное развитие клиентов. Эти измерения могут не иметь большого значения по отдельности, но в сочетании они рисуют четкую картину того, что поддержка и документация для redis больше и гораздо более актуальны.

настойчивость

по умолчанию redis сохраняет ваши данные на диск с помощью механизм фиксации. Если у вас достаточно оперативной памяти, он может записывать все ваши данные на диск почти без снижения производительности. Это почти бесплатно!

в режиме моментального снимка есть вероятность, что внезапный сбой может привести к небольшому количеству потерянных данных. Если вам абсолютно необходимо убедиться, что данные никогда не теряются, не волнуйтесь, redis тоже имеет свою спину в режиме AOF (добавить только файл). В этом режиме сохраняемости данные могут быть синхронизированы на диск по мере записи. Это может уменьшите максимальную пропускную способность записи до того, насколько быстро ваш диск может писать, но все равно должен быть довольно быстрым.

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

используйте Redis, если

  1. требуется выборочное удаление / истечение срока действия элементов в кэше. (Вам это нужно)

  2. требуется возможность запроса ключей определенного типа. эквивалент. 'blog1: сообщения:*', 'blog2:категории:xyz: сообщения:*'. О да! это очень важно. Используйте это для выборочного аннулирования определенных типов кэшированных элементов. Вы также можете использовать это для аннулирования кэша фрагментов, кэша страниц, только объектов AR данного типа, так далее.

  3. Persistence (вам это тоже понадобится, если вы не согласны с тем, что ваш кеш должен разогреваться после каждого перезапуска. Очень важно для объектов, которые редко меняются)

используйте memcached if

  1. Memcached дает вам headached!
  2. МММ... кластеризация? мех. если вы собираетесь зайти так далеко, используйте лак и Redis для кэширования фрагментов и AR-объектов.

из моего опыта у меня было намного лучше стабильность с Redis чем Memcached

Memcached является многопоточным и быстрым.

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

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

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

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

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

по умолчанию redis использует jemalloc распределитель памяти, который изо всех сил старается быть компактным и быстрым, но это распределитель памяти общего назначения, и он не может идти в ногу с большим количеством выделений и очистки объектов, происходящих с высокой скоростью. Из-за этого на некоторые нагрузки шаблоны redis процесс, по-видимому, может утечка памяти из-за внутренней фрагментации. Например, если у вас есть сервер с 7 Гб ОЗУ, и вы хотите использовать redis в качестве непостоянного кэша LRU, вы можете найти этот процесс redis с maxmemory установить на 5 Гб с течением времени будет использовать все больше и больше памяти, в конечном итоге ударив общий предел оперативной памяти, пока убийца из памяти не вмешается.

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

С учетом сказанного, memcached по-прежнему имеет сильную позицию в средах, где использование памяти должно быть принудительным и/или быть предсказуемый. Мы попытались использовать последний стабильный redis (2.8.19) в качестве замены непостоянного memcached на основе LRU в рабочей нагрузке 10-15k op/s, и он сильно просочился в память; та же рабочая нагрузка разбила экземпляры ElastiCache redis Amazon через день или около того по тем же причинам.

Memcached хорош в том, чтобы быть простым хранилищем ключей / значений и хорошо делать key => STRING. Это делает его действительно хорошим для хранения сессии.

Redis хорошо делает ключ = > SOME_OBJECT.

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

также удачи в поиске каких-либо объективных критериев, если вы найдете некоторые любезно отправить их мой путь.

Если вы не возражаете против грубого стиля письма, Redis vs Memcached на блоге Systoilet стоит прочитать с точки зрения удобства использования, но обязательно прочитайте назад и вперед в комментариях, прежде чем делать какие-либо выводы о производительности; есть некоторые методологические проблемы (однопоточные тесты занятого цикла), и Redis также внес некоторые улучшения с момента написания статьи.

и ни одна ссылка бенчмарка не завершена, не запутывая вещи немного, так что также проверьте некоторые конфликтующие тесты на Живой Журнал Дормондо и Антирез Веблог.

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

Я получил возможность использовать как memcached , так и redis вместе в прокси-сервере кэширования, над которым я работал, позвольте мне поделиться с вами, где именно я использовал то, что и причина того же....

Redis>

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

2) в основном, его ключ/значение магазина , так что где-либо в вашем приложении вы есть что-то подобное, можно использовать redis с большим беспокойством.

3) Redis настойчивость, отказоустойчивость и резервное копирование (AOF ) облегчат вашу работу .

Memcache >

1) да, оптимизированная память, которая может быть использована в качестве кэша . Я использовал его для хранения содержимого кэша, доступ к которому осуществляется очень часто (с 50 ударами в секунду)с размером менее 1 МБ .

2) я выделил только 2 ГБ из 16 ГБ для memcached, что тоже, когда мой единственный размер контента был >1 МБ .

3) поскольку содержание растет вблизи пределов , иногда я наблюдал более высокое время отклика в статистике(не в случае с redis).

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

кроме того, есть результат бенчмаркинга, доступный на этом ссылке, ниже немного higlight от то же самое,

enter image description here

enter image description here

надеюсь, что это помогает!!

еще один бонус заключается в том, что может быть очень ясно, как memcache будет вести себя в сценарии кэширования, в то время как redis обычно используется в качестве постоянного хранилища данных, хотя его можно настроить так же, как memcached aka, выселяя наименее недавно использованные элементы, когда он достигает максимальной емкости.

некоторые приложения, над которыми я работал, используют оба, чтобы понять, как мы намерены вести себя с данными - материал в memcache, мы пишем код для обработки случаев, когда его нет - материал в redis, мы полагаться на его там.

кроме того, Redis обычно считается превосходным для большинства случаев использования, будучи более многофункциональным и, следовательно, гибким.

было бы правильно, если бы мы сказали, что redis-это комбинация (кэш + структура данных), а memcached-это просто кэш.

одно из основных отличий, которое не было указано здесь, заключается в том, что Memcache имеет верхний предел памяти во все времена, в то время как Redis не по умолчанию (но может быть настроен). Если вы всегда хотите хранить ключ / значение в течение определенного времени (и никогда не выселять его из-за нехватки памяти), вы хотите пойти с Redis. Конечно, вы также рискуете проблемой нехватки памяти...

очень простой тест для установки и получения 100k уникальных ключей и значений против redis-2.2.2 и memcached. Оба работают на виртуальной машине linux (CentOS), а мой клиентский код(вставленный ниже) работает на рабочем столе windows.

Рэдис

  • время, необходимое для хранения 100000 значений = 18954ms

  • время, необходимое для загрузки 100000 значений = 18328ms

Memcached

  • время, необходимое для хранения 100000 значений = 797 МС

  • время, необходимое для получения 100000 значений = 38984ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

мы думали о Redis как о взлете нагрузки для нашего проекта на работе. Мы думали, что с помощью модуля в nginx под названием HttpRedis2Module или что-то подобное мы будем иметь удивительную скорость, но при тестировании с AB-test мы оказались неправы.

возможно, модуль был плохим или наш макет, но это была очень простая задача, и еще быстрее было взять данные с php, а затем поместить их в MongoDB. Мы используем APC в качестве кэш-системы и с этим php и MongoDB. Это было намного быстрее, чем модуль nginx для Redis.

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

самая большая оставшаяся причина-это специализация.

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

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

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

Redis лучше Плюсы Redis являются,

1.It has a lot of data storage options such  as  string  , sets , sorted sets ,  hashes ,  bitmaps
2.Disk Persistence of records 
3.Stored Procedure (LUA acripting)  support
4.Can act as a Message Broker using PUB/SUB

в то время как Memcache-это система типов кэша значений ключей в памяти.

  1. нет поддержки для различных типов данных хранилищ, таких как списки, наборы, как в редис.
  2. главный con-Memcache не имеет сохраняемости на диске .

Memcached будет быстрее, если вы заинтересованы в производительности, просто потому, что Redis включает в себя сеть (TCP-вызовы). Также внутренне Memcache быстрее.

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

Ну я в основном использовал как с моими приложениями, Memcache для кэширования сессий и redis для объектов запросов doctrine/orm. С точки зрения производительности оба почти одинаковы.