Ответ 1
Сводка (TL; DR)
Обновлено 3 июня 2017 года
Redis более мощный, более популярный и лучше поддерживается, чем memcached. Memcached может сделать лишь небольшую часть вещей, которые может сделать Redis. Redis лучше даже там, где их функции перекрываются.
Для чего-нибудь нового используйте Redis.
Memcached vs Redis: Прямое сравнение
Оба инструмента - это мощные, быстрые хранилища данных в памяти, которые полезны в качестве кеша. Оба могут помочь ускорить ваше приложение путем кэширования результатов базы данных, фрагментов HTML или чего-то еще, что может быть дорого сгенерировано.
Точки для рассмотрения
При использовании для одной и той же вещи, вот как они сравнивают, используя исходный вопрос "Очки для рассмотрения":
- Скорость чтения/записи: обе очень быстрые. Тесты различаются в зависимости от рабочей нагрузки, версий и многих других факторов, но обычно показывают, что redis должен быть таким же быстрым или почти таким же быстрым, как memcached. Я рекомендую redis, но не потому, что memcached работает медленно. Это не так.
- Использование памяти: Redis лучше.
- memcached: вы указываете размер кеша, и когда вы вставляете элементы, демон быстро растет чуть больше, чем этот размер. Никогда не существует способа вернуть какое-либо из этого пространства, кроме перезапуска memcached. Все ваши ключи могут быть истекли, вы можете очистить базу данных, и она по-прежнему будет использовать полный блок RAM, с которым вы его настроили.
- 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.
Superset Redis
Redis - это больше, чем кеш. Это сервер структуры данных в памяти. Ниже вы найдете краткий обзор вещей, которые Redis может сделать за пределами простого кеша ключ/значение, такого как memcached. Большинство функций redis - вещи, которые memcached не может сделать.
Документация
Redis лучше документирован, чем memcached. Хотя это может быть субъективным, все это кажется все более и более истинным.
redis.ioявляется фантастическим легко перемещаемым ресурсом. Он позволяет попробовать redis в браузере и даже дает вам живые интерактивные примеры с каждой командой в документах.
В настоящее время существует 2x столько же результатов stackoverflow для redis, что и memcached. 2x столько же результатов Google. Более доступные примеры на других языках. Более активное развитие. Более активное развитие клиентов. Эти измерения могут не означать много индивидуально, но в комбинации они рисуют четкую картину, что поддержка и документация для redis больше и намного более актуальны.
Persistence
По умолчанию redis сохраняет ваши данные на диск с помощью механизма snapshotting. Если у вас достаточно доступной оперативной памяти, она может записывать все ваши данные на диск, практически не ухудшая производительность. Это почти бесплатно!
В режиме моментального снимка есть вероятность, что внезапный сбой может привести к небольшому количеству потерянных данных. Если вам абсолютно необходимо убедиться, что данные не потеряны, не волнуйтесь, redis также имеет вашу спину с режимом AOF (Append Only File). В этом режиме сохранения данные могут быть синхронизированы с диском по мере его записи. Это может снизить максимальную пропускную способность записи, однако скорость вашего диска может быть записана, но должна быть довольно быстрой.
Есть много вариантов конфигурации, чтобы точно настроить сохранение, если вам нужно, но значения по умолчанию очень разумные. Эти параметры упрощают настройку redis как безопасного, избыточного места для хранения данных. Это реальная база данных.
Многие типы данных
Memcached ограничивается строками, но Redis - это сервер структуры данных, который может обслуживать множество разных типов данных. Он также предоставляет команды, необходимые для максимального использования этих типов данных.
Строки (commands)
Простые текстовые или двоичные значения, размер которых может быть до 512 МБ. Это единственный тип данных redis и memcached, хотя memcached-строки ограничены 1MB.
Redis предоставляет вам больше инструментов для использования этого типа данных, предлагая команды для побитовых операций, манипуляции на уровне бит, поддержки приращения/уменьшения с плавающей запятой, запросов диапазона и операций с несколькими ключами. Memcached не поддерживает это.
Строки полезны для всех видов прецедентов, поэтому memcached довольно полезен только для этого типа данных.
Хеши (commands)
Хеши вроде хранилища значений ключей в хранилище значений ключей. Они отображают между строковыми полями и строковыми значениями. Карты Field- > value с использованием хэша немного более эффективны по площади, чем карты key- > value, используя регулярные строки.
Хэши полезны в качестве пространства имен или когда вы хотите логически группировать многие ключи. С помощью хэша вы можете эффективно использовать всех членов, истечь всех членов вместе, удалить всех членов вместе и т.д. Отлично подходит для любого варианта использования, когда у вас есть несколько пар ключ/значение, которые необходимо сгруппировать.
Одним из примеров использования хэша является сохранение пользовательских профилей между приложениями. Хэши redis хранятся с идентификатором пользователя, так как ключ позволит вам хранить как можно больше бит данных о пользователе, сохраняя при этом их хранение под одним ключом. Преимущество использования хэша вместо сериализации профиля в строке состоит в том, что вы можете иметь разные приложения для чтения/записи разных полей в профиле пользователя, не беспокоясь о том, что одно приложение переопределяет изменения, сделанные другими (что может произойти, если вы сериализуете устаревшие данные).
Списки (commands)
Списки Redis представляют собой упорядоченные коллекции строк. Они оптимизированы для вставки, чтения или удаления значений из верхнего или нижнего (aka: left или right) списка.
Redis предоставляет много commands для использования списков, включая команды для push/pop items, push/pop между списками, обрезание списков, выполнение диапазон запросов и т.д.
Списки делают большие прочные, атомные очереди. Они отлично подходят для очередей заданий, журналов, буферов и многих других случаев использования.
Наборы (commands)
Установки представляют собой неупорядоченные коллекции уникальных значений. Они оптимизированы, чтобы вы могли быстро проверить, установлено ли значение в наборе, быстро добавлять/удалять значения и измерять перекрытие с другими наборами.
Они отлично подходят для таких вещей, как списки контроля доступа, уникальные трекеры посетителей и многое другое. Большинство языков программирования имеют нечто похожее (обычно называемое Set). Это похоже на то, что распространяется только.
Redis предоставляет несколько commands для управления наборами. Очевидны такие, как добавление, удаление и проверка набора. Таким образом, менее очевидные команды, такие как выскакивание/чтение случайного элемента и команды для выполнения объединений и пересечений с другими наборами.
Сортированные наборы (commands)
Сортированные наборы также являются коллекциями уникальных значений. Эти, как следует из названия, упорядочены. Они упорядочиваются по счету, затем лексикографически.
Этот тип данных оптимизирован для быстрого поиска по счету. Получение наивысшего, самого низкого или любого диапазона значений между ними происходит очень быстро.
Если вы добавите пользователей в отсортированный набор вместе с их высоким счетом, у вас будет идеальная доска лидеров. Когда появятся новые высокие результаты, просто добавьте их в набор снова с их высоким счетом, и он будет переупорядочивать ваш лидирующий борт. Также отлично подходит для отслеживания последнего посещения пользователями и активного пользователя в вашем приложении.
Сохранение значений с одинаковой оценкой заставляет их упорядочиваться лексикографически (мыслить в алфавитном порядке). Это может быть полезно для таких функций, как функции автозаполнения.
Многие из отсортированного набора commands похожи на команды для наборов, иногда с дополнительным параметром оценки. Также включены команды для управления оценками и запросов по результату.
Geo
Redis имеет несколько commands для хранения, извлечения и измерения географических данных. Это включает в себя радиус-запросы и измерение расстояний между точками.
Технически географические данные в redis хранятся в отсортированных наборах, поэтому это не действительно отдельный тип данных. Это больше расширение на вершине отсортированных множеств.
Растровое изображение и HyperLogLog
Подобно geo, это не полностью отдельные типы данных. Это команды, которые позволяют обрабатывать строковые данные, как если бы они были либо растровыми, либо гиперлогами.
Растровые изображения - это то, к чему относятся операторы уровня бит, на которые я ссылаюсь в Strings
. Этот тип данных был основным строительным блоком для недавнего совместного арт-проекта reddit: r/Place.
HyperLogLog позволяет использовать постоянное чрезвычайно малое количество пространства для подсчета почти неограниченных уникальных значений с потрясающей точностью. Используя только ~ 16 КБ, вы можете эффективно подсчитывать количество уникальных посетителей на вашем сайте, даже если это число в миллионах.
Сделки и атомарность
Команды redis являются атомарными, что означает, что вы можете быть уверены, что как только вы напишете значение для redis, это значение будет видимым для всех клиентов, подключенных к redis. Нет никакого ожидания распространения этого значения. Технически memcached также является атомарным, но с redis, добавляющим всю эту функциональность за пределы memcached, стоит отметить и несколько впечатляюще, что все эти дополнительные типы данных и функции также являются атомарными.
Несмотря на то, что в реляционных базах данных не совсем то же самое, что и транзакции в реляционных базах данных, redis также имеет transactions, которые используют "оптимистичную блокировку" (WATCH/MULTI/EXEC).
Pipelining
Redis предоставляет функцию, называемую pipelining '. Если у вас есть много команд redis, которые вы хотите выполнить, вы можете использовать конвейерную обработку для отправки их для повторного использования "все-в-одном" вместо одного раза в день.
Обычно, когда вы выполняете команду для redis или memcached, каждая команда представляет собой отдельный цикл запроса/ответа. При конвейерной обработке redis может буферизовать несколько команд и выполнять их все сразу, отвечая на все ответы на все ваши команды за один ответ.
Это может позволить вам достичь еще большей пропускной способности при массовом импорте или других действиях, которые включают в себя множество команд.
Pub/Sub
Redis имеет commands, посвященный pub/sub function, что позволяет redis выступать в качестве высокоскоростного вещательного вещателя. Это позволяет одному клиенту публиковать сообщения для многих других клиентов, подключенных к каналу.
Redis делает pub/sub, а также практически любой инструмент. Выделенные брокеры сообщений, такие как RabbitMQ, могут иметь преимущества в определенных областях, но тот факт, что тот же сервер может также предоставить вам постоянные долговременные очереди и другие данные структура вашей паба/вспомогательной нагрузки, вероятно, потребуется, Redis часто оказывается лучшим и самым простым инструментом для работы.
Lua Scripting
Вы можете подумать о сценариях lua, например redis собственный SQL или хранимые процедуры. Это и больше, и меньше, но аналогия в основном работает.
Возможно, у вас есть сложные вычисления, которые вы хотите выполнить redis. Возможно, вы не можете позволить себе вернуть свои транзакции и нуждаться в гарантиях, каждый шаг сложного процесса будет происходить атомарно. Эти проблемы и многие другие могут быть решены с помощью сценариев lua.
Весь script выполняется атомарно, поэтому, если вы можете поместить свою логику в lua script, вы часто можете избежать беспорядка с оптимистичными транзакциями блокировки.
масштабирование
Как упоминалось выше, redis включает встроенную поддержку кластеризации и в комплекте с его собственным инструментом высокой доступности под названием redis-sentinel
.
Заключение
Без колебаний я бы рекомендовал redis над memcached для любых новых проектов или существующих проектов, которые еще не используют memcached.
Вышеприведенное может звучать так, как будто мне не нравится memcached. Напротив, это мощный, простой, стабильный, зрелый и закаленный инструмент. Есть даже некоторые варианты использования, где это немного быстрее, чем redis. Я люблю memcached. Я просто не думаю, что это имеет смысл для будущего развития.
Redis делает все memcached, часто лучше. Любое преимущество производительности для memcached является незначительным и зависит от нагрузки. Есть также рабочие нагрузки, для которых redis будет быстрее, и многие другие рабочие нагрузки, которые redis могут делать, которые memcached просто не могут. Крошечные отличия в производительности кажутся незначительными перед лицом гигантского залива в функциональности, и тот факт, что оба инструмента настолько быстры и эффективны, что они могут быть последним элементом вашей инфраструктуры, вам когда-либо придется беспокоиться о масштабировании.
Существует только один сценарий, в котором memcached имеет больше смысла: где memcached уже используется в качестве кеша. Если вы уже кэшируете memcached, продолжайте использовать его, если он соответствует вашим потребностям. Скорее всего, не стоит пытаться переходить на redis, и если вы собираетесь использовать redis только для кеширования, это может не принести достаточно пользы, чтобы стоить вашего времени. Если memcached не отвечает вашим потребностям, вы, вероятно, должны перейти к redis. Это верно, нужно ли масштабировать за пределы memcached или вам нужны дополнительные функции.