Если redis уже является частью стека, почему Memcached все еще используется вместе с Redis?

Redis может делать все, что предоставляет Memcached (кэш LRU, срок действия элемента и теперь кластеризация в версии 3.x+, в настоящее время в бета-версии) или такими инструментами, как twemproxy. Спектакль тоже похож. Более того, Redis добавляет постоянство, из-за которого вам не нужно делать потепление кэша в случае перезапуска сервера.

ссылка на некоторые старые ответы, которые сравнивают Redis и Memcache, некоторые из которых предпочитают Redis в качестве замены Memcache (если уже присутствуют в stack):

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

по состоянию на 2014 год, почему memcached все еще стоит боли, которая будет добавлена в качестве дополнительного компонента в ваш стек, когда у вас уже есть компонент Redis, который может сделать все, что может memcached? Каковы благоприятные моменты, которые склоняют архитекторов/инженеров все еще включать memcached помимо уже существующих Redis?

обновление :

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

некоторые примеры сценариев:

  • Список всех кэшированных ключей по определенному шаблону и чтение или удаление их значений. Очень легко в redis, не выполнимо (легко ) в memcached.
  • хранение полезной нагрузки более 1 Мб, легко сделать в redis, требует настроек размера плиты в memcached, который имеет побочные эффекты собственной производительности.
  • легкие снимки текущего содержимого кэша
  • Redis cluster также готов к производству вместе с языковыми драйверами,поэтому кластерное развертывание также легко.

2 ответов


основная причина, по которой я вижу сегодня как вариант использования memcached над Redis, - это превосходная эффективность памяти, которую вы должны иметь возможность получить с простые кэширование фрагментов HTML (или аналогичных приложений). Если вам нужно хранить разные поля ваших объектов в разных ключах memcached, то хэши Redis будут более эффективными для памяти, но когда у вас есть большое количество пар key - > simple_string, memcached должен быть в состоянии дать вам больше элементов за мегабайт.

другие вещи, которые являются хорошими моментами о memcached:

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

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

сравнение между Redis LRU и memcached LRU.

и memcached, и Redis не выполняют реальных выселений LRU, но только приближение этого.

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

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

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

почему memcached имеет лучший объем памяти, чем Redis для простая строка - > строковые карты.

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

когда Redis начинает быть более эффективной памяти

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

вы можете фактически сохранить объект в memcached как один JSON (или двоичный код) blob, но, в отличие от Redis, это не позволит вам получить или обновить независимые поля.

преимущество Redis в контексте интеллектуального кэширования.

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

например, представьте, что вам нужно кэшировать последние новости N, размещенные в Hacker News, чтобы заполнить" новейший " раздел сайта. Что вы делаете с Redis взять список (ограниченный M элементами)с последними новостями. Если вы используете другое хранилище для своих данных и Redis в качестве кэша, вы должны заполнить и представления (Redis и DB)при разноске нового элемента. Нет недействительности кэша.

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

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


привычки трудно сломать :)

серьезно, есть две основные причины-к моему пониманию-почему Memcached все еще используется:

  1. Legacy-есть разработчики, которые удобны и знакомы с Memcached, а также приложения, которые его поддерживают. Это также означает, что это зрелая и хорошо проверенная технология.
  2. масштабирование-стандартный Memcached легко масштабируется по горизонтали, тогда как Redis (до и за исключением скоро-будет-выпущен v3) требует больше работы с этой целью (т. е. sharding).
:
  1. Re. наследие-учитывая надежность Redis (структуры данных, команды, настойчивость...), он активно развивается и клиенты на всех мыслимых языках-новые приложения обычно создать.
  2. re масштабирование-помимо предстоящего v3, есть решения, которые могут сделать масштабирование намного проще. Например, Redis Облако предлагает бесшовные масштабирование без потери данных или прерывания обслуживания. Еще один популярный подход к масштабированию / sharding Redis - twemproxy.