Memcached против Redis?

1468

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

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

Вопросы для рассмотрения:

  • Скорость чтения / записи.
  • Использование памяти.
  • Дамп ввода-вывода дамп.
  • Масштабирование.
Сагив Офек
источник
38
Другой анализ в дополнение к комментариям ниже: Google Trends: redis против memcached
MarkHu
3
Один комментарий, который не заслуживает ответа: если вы смотрите на облачные сервисы для этих двух систем (например, дополнения heroku), сервисы Memcached иногда по несколько раз дешевле на МБ по любой причине.
Бен Робертс
2
Для масштабируемости: Imgur и Twitter используют оба
the_red_baron

Ответы:

2108

Резюме (TL; DR)

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

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

Для всего нового используйте Redis.

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

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

Вопросы для рассмотрения

Когда они используются для того же, вот как они сравнивают, используя оригинальный вопрос «Вопросы для рассмотрения»:

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

Memcached

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

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

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

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

Redis

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

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

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

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

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

Redis Superset

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

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

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

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

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

Упорство

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

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

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

Много типов данных

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

Строки ( команды )

Простой текст или двоичные значения размером до 512 МБ. Это единственный тип данных redis и memcached share, хотя строки memcached ограничены 1 МБ.

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

Строки полезны для всех видов использования, поэтому memcached довольно полезен только с этим типом данных.

Хеши ( команды )

Хэши являются своего рода хранилищем значений ключей в хранилище значений ключей. Они отображаются между строковыми полями и строковыми значениями. Карты Field-> value, использующие хэш, занимают немного больше места, чем карты key-> value, использующие обычные строки.

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

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

Списки ( команды )

Списки Redis - это упорядоченные коллекции строк. Они оптимизированы для вставки, чтения или удаления значений сверху или снизу (иначе: слева или справа) списка.

Redis предоставляет множество команд для использования списков, в том числе команды для перемещения / извлечения элементов, перемещения / извлечения между списками, усечения списков, выполнения запросов диапазона и т. Д.

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

Наборы ( команды )

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

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

Redis предоставляет несколько команд для управления наборами. Очевидные, такие как добавление, удаление и проверка набора присутствуют. Поэтому менее очевидны такие команды, как запись / чтение случайного элемента и команды для объединения и пересечения с другими наборами.

Сортированные наборы ( команды )

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

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

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

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

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

Geo

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

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

Растровое изображение и HyperLogLog

Как и гео, это не полностью отдельные типы данных. Это команды, которые позволяют вам обрабатывать строковые данные, как если бы они были либо растровыми, либо гиперлоглогами.

Битовые карты - это то, для чего предназначены операторы битового уровня, на которые я ссылаюсь Strings. Этот тип данных был основным строительным блоком для недавнего арт-проекта reddit: r / Place .

HyperLogLog позволяет использовать постоянное чрезвычайно малое пространство для подсчета практически неограниченных уникальных значений с потрясающей точностью. Используя всего ~ 16 КБ, вы можете эффективно подсчитать количество уникальных посетителей вашего сайта, даже если это число исчисляется миллионами.

Транзакции и атомарность

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

Несмотря на то, что транзакции в реляционных базах данных не совсем такие же, в Redis также есть транзакции , использующие «оптимистическую блокировку» ( WATCH / MULTI / EXEC ).

Pipelining

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

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

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

Pub / Sub

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

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

Lua Scripting

Вы можете думать о сценариях lua, таких как собственный SQL или хранимые процедуры redis. Это и больше, и меньше, но аналогия в основном работает.

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

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

пересчет

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

Вывод

Не долго думая, я бы порекомендовал redis over memcached для любых новых проектов или существующих проектов, которые еще не используют memcached.

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

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

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

Карл Зулауф
источник
11
Как Memcached предлагает кластеризацию таким образом, который существует на самом сервере? Я всегда использовал библиотеки, которые распространялись на пул серверов memcached с использованием алгоритмов хеширования или модуля. То же самое относится и к Redis. В основном я использую Python, и, похоже, есть немало модулей, которые не используют библиотеку memcached для обработки пулов соединений.
whardier
2
«Транзакции с оптимистической блокировкой (WATCH / MULTI / EXEC)» - Redis не имеет нужных транзакций. Т.е. если [multi, cmd1, cmd2, cmd3 (исключение), exec], то cmd1 и cmd2 будут выполнены.
ZedZip
10
@ Олег, это не совсем так. Если вы используете multi-exec, команды буферизуются (то есть: не выполняются) до тех пор, пока exec не произойдет, поэтому, если у вас есть исключение перед exec, то никакие команды фактически не выполняются. Если вызывается exec, все буферизованные команды выполняются атомарно, если, конечно, переменная наблюдения не была изменена с момента первого вызова multi. Этот последний механизм является частью оптимистичной блокировки.
Карл Зулауф
3
@ whardier Ты прав. Обновленный ответ для отражения того, что «поддержка» кластера memcached включена дополнительными инструментами. Должен был изучить это лучше.
Карл Зулауф
3
как насчет кластеризации с сервером couchbase? (memcached совместимый)
Кен Лю
142

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

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

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

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

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

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

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

SMathew
источник
7
В документации Redis говорится, что для использования шаблонов требуется сканирование таблицы. blog1: posts: * может потребоваться сканирование таблицы O (N). Конечно, это все еще быстро на наборах данных разумного размера, так как Redis работает быстро. Это должно быть хорошо для тестирования или администратора.
Мисти
182
Головная боль это шутка, верно? :-) Я гуглил на memcached головную боль, но не нашел ничего разумного. (Я новичок в Memcached и Redis)
KajMagnus
11
проголосовали вниз по той же причине , чем @pellucide. Redis может быть лучше, чем Memcached, но Memcached тривиально использовать. У меня никогда не было проблем с этим, и это тривиально настроить.
Диего Янчич
5
Спасибо @KajMagnus за то, что я сделал мой день .. возможно всю мою неделю 😂
alex
@DiegoJancic Redis - одна из самых простых в использовании технологий. Без предварительного знания Redis мне понадобилось всего 20 минут, чтобы установить его на Ubuntu с помощью менеджера пакетов в облаке и начать делать простые запросы. Спустя 4 часа я мог представить более сложные сценарии с пакетными вставками, используя скрипт Lua и выбирая правильную (NIO) библиотеку Java для повышения производительности. Я не могу представить ничего более дружественного и простого в использовании, чем Redis.
Лось на свободе
105

Memcached многопоточный и быстрый.

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

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

В. Эндрю Лоэ III
источник
2
Сайты с большим трафиком, которые вложили значительные средства в memcached и имеют узкие места в базе данных по нереляционным данным, подобным «профилю пользователя», должны оценивать couchbase параллельно с обычным Mongo, Redis
2
@siliconrockstar - уверен, что Redis 3 по-прежнему одноядерный; по крайней мере AWS Redis (который использует 3.2.6 или 3.2.10) предупреждает, чтобы принять это во внимание при рассмотрении, например, EngineCpuUtilization Metrics
dwanderson
1
Похоже, вы правы, я думаю, что когда я сделал этот комментарий, я основывал его на неполных источниках. Удаленный комментарий.
silicrockstar
но вы все еще можете запустить $ core_count экземпляров Redis
Imaskar
2
Redis чрезвычайно сфокусирован на эффективности - поэтому вам нужно спросить себя, почему группа умных разработчиков решила оставить его однопоточным? Из документации Redis «Процессоры нередко становятся узким местом в Redis, так как обычно Redis связан либо с памятью, либо с сетью». Если бы вы использовали сервер grunty, который был связан с процессором, то у вас, вероятно, много пользователей, и в любом случае у вас должно быть несколько резервных серверов. Если вы хотите максимально использовать несколько процессоров на одном сервере, используйте разделы. Читайте: redis.io/topics/…
robocat
91

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

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

Поскольку redis - это база данных nosql с множеством функций, а кэширование - это только одна опция, для которой она может использоваться, она распределяет память по мере необходимости - чем больше объектов вы помещаете в нее, тем больше памяти она использует. maxmemoryВариант не строго соблюдает верхний предел использования памяти. Когда вы работаете с кешем, ключи выселяются и просрочены; скорее всего, ваши ключи имеют разный размер, поэтому происходит фрагментация внутренней памяти.

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

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

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

Artyom
источник
2
От redis.io/topics/faq : Redis имеет встроенные средства защиты, позволяющие пользователю устанавливать максимальный лимит использования памяти, используя параметр maxmemory в файле конфигурации, чтобы установить лимит памяти, который может использовать Redis. Если этот предел достигнут, Redis начнет отвечать с ошибкой при написании команд (но продолжит принимать команды только для чтения), или вы можете настроить его так, чтобы исключать ключи при достижении максимального предела памяти в случае, если вы используете Redis для кеширования. У нас есть документация, если вы планируете использовать Redis в качестве LRU-кэша. ссылка
StefanNch
8
Параметр @StefanNch redis ' maxmemoryне учитывает фрагментацию внутренней памяти. Пожалуйста, смотрите мой комментарий выше для деталей - проблемы, которые я описал, были обнаружены в сценарии, описанном на странице «Redis as LRU cache» с включенными параметрами ограничения памяти. Memcached, с другой стороны, использует другой подход, чтобы избежать проблемы фрагментации памяти, поэтому его предел памяти гораздо более «жесткий».
Артем
46

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

Redis хорош в выполнении key => SOME_OBJECT.

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

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

Эрик Петерсен
источник
2
IMO тип данных Redis Hash имеет гораздо больше смысла для хранения переменных сеанса, чем их сериализация в строку memcached.
Карл Зулауф
6
Если вам небезразличен пользовательский опыт, не помещайте свои сессии в кеш. dormando.livejournal.com/495593.html
sleblanc
4
@sebleblanc Теоретически это не должно быть проблемой для Redis, так как также существует стойкость диска.
haknick
2
@sebleblanc memcache по-прежнему хорош в хранении сессий, плохо это реализовано или нет. да, выселение - это проблема, но она ни в коем случае не является непреодолимой, и это не проблема memcache, если вы не беспокоитесь о выселении. Я полагаю, что большинство решений сессий memcache используют куки в качестве резервной копии.
Эрик Петерсен
11
«Не помещайте свои сессии в кеш» вводит в заблуждение. Что вы имеете в виду "Не только хранить свои сессии в кэше". Любой, кто хранит важные данные только в memcache, должен быть немедленно уволен.
Джейкоб
37

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

И ни одна ссылка на эталонный тест не является полной, не путая вещи, поэтому также проверьте некоторые противоречивые тесты в Живом Журнале Дормондо и Antirez Weblog .

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

Пол Смит
источник
9
в Redis против Memcached теста плохо задумано. oldblog.antirez.com/post/redis-memcached-benchmark.html
Работа приложения
28
Вы не шутили о грубости.
ocodo
1
Более того, в течение 2010 года, устаревший блог
Siddharth
24

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

Redis>

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

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

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

Memcache>

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

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

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

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

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

введите описание изображения здесь

введите описание изображения здесь

Надеюсь это поможет!!

Джайн рач
источник
14

Тестовое задание. Запустите несколько простых тестов. В течение долгого времени я считал себя носорогом старой школы, так как использовал в основном memcached и считал Redis новым ребенком.

С моей нынешней компанией Redis использовался как основной кеш. Когда я копался в статистике производительности и просто начинал тестировать, Redis был с точки зрения производительности сопоставимым или минимально медленным чем MySQL.

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

  • для больших значений (требуется изменение размера плиты, но работает)
  • для нескольких одновременных запросов

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

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

  • тип оборудования, на котором вы запускаете Redis
  • типы данных, которые вы храните
  • количество получает и устанавливает
  • насколько одновременно ваше приложение
  • Вам нужно хранение структуры данных

Лично я не разделяю точку зрения авторов Redis на параллелизм и многопоточность.

mdomans
источник
пожалуйста, объясните "как минимум медленнее, чем MySQL".
Анирудха Гупта
Честно говоря, у меня нет под рукой этих эталонных данных, но в этом конкретном случае было много операций чтения / записи
mdomans
13

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

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

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

Скотт Шультесс
источник
10

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

Атиф Хуссейн
источник
1
это хороший ответ - Laravel использует Redis в качестве кэша и в качестве механизма хранения данных
Miroslav Trninic
8

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

Redis

  • Время хранения 100000 значений = 18954 мс

  • Время загрузки 100000 значений = 18328 мс

Memcached

  • Время хранения 100000 значений = 797 мс

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


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");
Прабху Нандан Кумар
источник
6
Поскольку вы, очевидно, использовали Java для измерения .... вы "прогревали" свои тестовые случаи? Это важно для измерения за такое короткое время ... чтобы JIT компилировал горячие точки.
cljk
7

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

Ztyx
источник
6

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

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

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

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

brightball
источник
6

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

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

Denys
источник
6

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

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

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

MS01
источник
Интересный ответ, но не уверен, что это поможет OP
Скотт Шультесс
Вставка в Redis и использование его в качестве кеша происходило медленнее, чем при использовании APC + PHP + MongoDB. Но только вставка в Redis была НАМНОГО медленнее, чем вставка непосредственно в MongoDB. Без APC я думаю, что они довольно равны.
Ms01
2
Это потому, что Монго не дает вам никакой гарантии, что то, что вы вставили, когда-либо будет записано на диск ...
Дамиан
21
но это веб-масштаб, mongodb будет бегать по кругу, пока ты пишешь. В настоящее время я пишу только в / dev / null, потому что это быстрее всего.
Ms01
1

Redis лучше.

Плюсы Redisесть,

  1. Он имеет много вариантов хранения данных, таких как строки, наборы, отсортированные наборы, хэши, растровые изображения
  2. Постоянство диска записей
  3. Хранимая процедура (LUAПоддержка скриптов)
  4. Может выступать в качестве брокера сообщений, используя PUB / SUB

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

  1. Нет поддержки для различных типов хранилищ данных, таких как списки, наборы, как в Redis.
  2. Основной недостаток Memcache - отсутствие сохранения диска.
атаван канапули
источник
0

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

Мухаммед Таки
источник
0

Вот действительно отличная статья / отличия от Amazon

Redis - явный победитель по сравнению с memcached.

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

Отличная информация о Redis, которая не поддерживается в Memcached

  • Снимки: пользователь может сделать снимок кеша Redis и сохранить его во вторичном хранилище в любой момент времени.
  • Встроенная поддержка многих структур данных, таких как Set, Map, SortedSet, List, BitMaps и т. Д.
  • Поддержка скриптов Lua в Redis
nagendra547
источник