Резюме (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 или вам нужна дополнительная функциональность.