Основная причина, по которой я вижу сегодня вариант использования memcached поверх Redis, - это превосходная эффективность использования памяти, которую вы должны получить при кэшировании простых HTML-фрагментов (или аналогичных приложений). Если вам нужно хранить разные поля ваших объектов в разных ключах memcached, тогда хэши Redis будут более эффективными с точки зрения памяти, но когда у вас есть большое количество пар ключ -> simple_string, memcached сможет предоставить вам больше элементов за мегабайт.
Другие достоинства memcached:
- Это очень простой фрагмент кода, поэтому, если вам просто нужна предоставляемая им функциональность, я думаю, это разумная альтернатива, но я никогда не использовал ее в производстве.
- Он многопоточный, поэтому, если вам нужно масштабировать установку с одним блоком, это хорошо, и вам нужно поговорить только с одним экземпляром.
Я считаю, что Redis как кеш имеет все больше и больше смысла по мере того, как люди переходят к интеллектуальному кэшированию или когда они пытаются сохранить структуру кешированных данных с помощью структур данных Redis.
Сравнение Redis LRU и memcached LRU.
И memcached, и Redis не выполняют настоящих выселений LRU, а только приближенно.
Вытеснение Memcache - это класс по размеру и зависит от деталей реализации его распределителя slab. Например, если вы хотите добавить элемент, который соответствует заданному классу размера, memcached попытается удалить просроченные / не недавно использованные элементы в этом классе, вместо этого, чтобы попытаться глобально понять, что это за объект, независимо от его размер, который является лучшим кандидатом.
Redis вместо этого пытается выбрать хороший объект в качестве кандидата на выселение при достижении maxmemory
предела, просматривая все объекты, независимо от класса размера, но может предоставить только приблизительно хороший объект, а не лучший объект с большим бездействием. время.
Redis делает это путем выборки нескольких объектов, выбирая тот, который бездействовал (не был доступен) в течение длительного времени. Начиная с Redis 3.0 (в настоящее время в стадии бета-тестирования) алгоритм был улучшен и также принимает хорошие пулы кандидатов при выселении, поэтому приближение было улучшено. В документации Redis вы можете найти описание и графики с подробностями о том, как это работает .
Почему memcached имеет лучший объем памяти, чем Redis, для простых строковых -> строковых карт.
Redis - более сложная программа, поэтому значения в Redis хранятся более похоже на объекты на языке программирования высокого уровня: у них есть связанный тип, кодировка, подсчет ссылок для управления памятью. Это делает внутреннюю структуру Redis хорошей и управляемой, но имеет накладные расходы по сравнению с memcached, который работает только со строками.
Когда Redis начинает более эффективно использовать память
Redis может хранить небольшие совокупные типы данных особым способом экономии памяти. Например, небольшой Redis Hash, представляющий объект, хранится внутри не с хеш-таблицей, а как двоичный уникальный BLOB-объект. Таким образом, установка нескольких полей для каждого объекта в хэш более эффективна, чем хранение N разделенных ключей в memcached.
Фактически вы можете сохранить объект в memcached как один JSON (или в двоичном коде) blob, но, в отличие от Redis, это не позволит вам получать или обновлять независимые поля.
Преимущество Redis в контексте интеллектуального кеширования.
Из-за структур данных Redis обычный шаблон, используемый с memcached для уничтожения объектов, когда кеш становится недействительным, для последующего воссоздания его из БД, является примитивным способом использования Redis.
Например, представьте, что вам нужно кэшировать последние N новостей, опубликованных в Hacker News, чтобы заполнить раздел «Самые новые» на сайте. Что вы делаете с Redis, так это берете список (до M элементов) с вставленными новейшими новостями. Если вы используете другое хранилище для своих данных и Redis в качестве кеша, вам нужно заполнить оба представления (Redis и БД) при публикации нового элемента. Нет недействительности кеша.
Однако у приложения всегда может быть логика, так что если список Redis окажется пустым, например, после запуска, исходное представление может быть воссоздано из БД.
Используя интеллектуальное кэширование, можно выполнять кэширование с помощью Redis более эффективным способом по сравнению с memcached, но не все проблемы подходят для этого шаблона. Например, кеширование фрагментов HTML может не принести пользу от этого метода.
Привычки сложно сломать :)
Если серьезно, то, насколько я понимаю, есть две основные причины, по которым Memcached все еще используется:
Тем не мение:
источник