Если redis уже является частью стека, почему Memcached все еще используется вместе с Redis?
Redis может делать все, что предоставляет Memcached (кэш LRU, срок действия элемента и теперь кластеризация в версии 3.x+, в настоящее время в бета-версии) или с помощью таких инструментов, как twemproxy. Спектакль тоже похож. Более того, Redis добавляет персистентность, из-за которой вам не нужно делать потепление кэша в случае перезагрузки сервера.
ссылка на некоторые старые ответы, которые сравнивают Redis и Memcache, некоторые из которых предпочитают Redis в качестве замены Memcache (если уже присутствуют в стек):
Memcached против Redis?
Redis и Memcache или просто Redis?
несмотря на это, изучая стеки крупных веб-компаний, таких как 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 over 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 и БД) при публикации нового элемента. Нет никакого аннулирования кэша.
однако приложение всегда может иметь логику, так что если список Redis окажется пустым, например, после запуска, начальное представление может быть повторно создано из БД.
С помощью интеллектуального кэширования это возможно выполнить кэширование с помощью Redis более эффективным способом по сравнению с memcached, но не все проблемы подходят для этого шаблона. Например, кэширование фрагментов HTML может не принести пользы от этого метода.
привычки трудно сломать :)
серьезно, хотя, есть две основные причины-к моему пониманию-почему Memcached все еще используется:
:
- Legacy-есть разработчики, которые комфортно и знакомы с Memcached, а также приложения, которые его поддерживают. Это также означает, что это зрелая и хорошо проверенная технология.
- масштабирование-стандартный Memcached легко масштабируется по горизонтали, тогда как Redis (до и за исключением скорого выпуска v3) требует больше работы с этой целью (т. е. осколки).
- Re. наследие-учитывая надежность Redis (структуры данных, команды, персистентность...), он активно развивается и клиенты на всех мыслимых языках - новые приложения обычно создать.
- Re масштабирование-помимо предстоящего v3, есть решения, которые могут сделать масштабирование намного проще. Например, Redis Cloud предлагает бесшовные масштабирование без потери данных или прерывания обслуживания. Другим популярным подходом к масштабированию/сегментированию Redis является twemproxy.
Comments