Когда я должен использовать Memcache вместо Memcached?

321

Похоже, что в PHP есть две библиотеки memcached с именами memcache и memcached . В чем разница и как вы знаете, какой использовать? Один устарел? Похоже, что memcached предлагает больше методов, поэтому я предполагаю, что это означает, что у него больше всего разработок - но, похоже, также требуются внешние библиотеки C / C ++, поэтому я не уверен, что смогу его установить.

Кажется, что memcache существует дольше, не требует дополнительных библиотек и имеет предварительно скомпилированные двоичные файлы даже для окон! Я думаю, что это был бы лучший выбор на данный момент. Однако, будучи новичком в memcached (сервер), я не уверен, есть ли в memcached (php) какие-то супер важные функции, которые делают его дополнительным трудом.

Xeoncross
источник
1
У ZendCon есть хороший эпизод, сравнивающий оба. Сессии ZendCon, Эпизод 040: Memcached: лучший интерфейс Memcache
Джон Магнолия
дубликата serverfault.com/questions/63383/memcache-vs-memcached всего за несколько дней, но это получило больше просмотров и голосов :)
Stefano

Ответы:

249

Клиентская библиотека Memcached недавно была выпущена как стабильная. Он используется digg (был разработан для digg Андреем Змиевским, теперь уже не с digg) и реализует гораздо больше протокола memcached, чем старый клиент memcache. Наиболее важные функции, которые имеет memcached:

  1. Cas токены . Это сделало мою жизнь намного проще и представляет собой простую систему предотвращения устаревших данных. Всякий раз, когда вы извлекаете что-то из кэша, вы можете получить с ним токен cas (двойное число). Вы можете использовать этот токен для сохранения обновленного объекта. Если никто не обновил значение во время работы вашего потока, обмен удастся. В противном случае был создан новый токен cas, и вам придется перезагрузить данные и снова сохранить их с новым токеном.
  2. Прочитанные обратные вызовы - лучшая вещь, так как нарезанный хлеб. Это упростило большую часть моего кода.
  3. getDelayed () - хорошая функция, которая может сократить время, в течение которого ваш сценарий должен ожидать результатов, возвращаемых с сервера.
  4. Хотя сервер memcached должен быть очень стабильным, он не самый быстрый. Вы можете использовать бинарный протокол вместо ASCII с более новым клиентом.
  5. Всякий раз, когда вы сохраняете сложные данные в memcached, клиент всегда выполнял сериализацию значения (что медленно), но теперь с memcached клиентом у вас есть возможность использовать igbinary . До сих пор у меня не было возможности проверить, насколько это может повысить производительность.

Мне было достаточно всего этого, чтобы перейти к новому клиенту и сказать, что он работает как шарм. Существует такая внешняя зависимость от библиотеки libmemcached , но, тем не менее, ее удалось установить на Ubuntu и Mac OSX, так что проблем пока нет.

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

До сих пор я не видел, чтобы какие-либо фреймворки брали новый клиент memcached (хотя я их не отслеживаю), но я предполагаю, что Zend скоро появится на борту.

ОБНОВИТЬ

Zend Framework 2 имеет адаптер для Memcached, который можно найти здесь

Миха Хрибар
источник
1
Отличный ответ; Кроме того, внешняя зависимость от libmemcached на самом деле является плюсом, в этом случае, поскольку это один из наиболее активно развивающихся клиентов.
Марк Боллинджер
Согласовано. Внешняя зависимость libmemcached не должна рассматриваться как проблема, как и libevent.
Миха Хрибар
1
Эта вещь Cas Tokens звучит как самый большой плюс. На самом деле, глядя на эти функции, кажется, что memcached больше ориентируется на управляемый держатель данных, например, на БД, а не на временный кеш.
Xeoncross
Если вы ищете что у вас уже есть memcachedb ( memcachedb.org ), который на самом деле является просто Berkley DB, который говорит по протоколу memcached.
Миха Хрибар
8
этот ответ даже не говорит о разнице между memcache и memcached ?! memcache - это просто старая версия memcached?
Даниэль В.
10

При использовании Windows сравнение обрывается: memcacheпредставляется единственным доступным клиентом.

rymo
источник
Не могли бы вы всегда добавить memcachedрасширение в себя?
Пейсер
1
Не похоже, что это на самом деле правда. commaster.net/content/install-memcached-windows
Джо Леонард
@JoeLeonard со страницы, на которую вы ссылаетесь: «Чтобы взаимодействовать с memcachedPHP, вам нужно установить memcacheрасширение для PHP»
rymo
8

Это 2013 год. Забудьте о комментариях 2009 года. Точно так же, если вы работаете с серьезными нагрузками на трафик, даже не задумайтесь над тем, как справиться с мемо-кешем на базе Windows. При работе с очень крупномасштабными (более 500 интерфейсными веб-серверами) и более чем 20 серверными базами данных и репликантами (смесь mysql и mssql) ферма серверов memcached (12 серверов в группе) поддерживает несколько приложений OLTP большого объема, отвечающих на 25K ~ 40K mc-> получать звонки в секунду. Эти вызовы не должны достигать базы данных.

ИМХО, такое использование memcached обеспечило СЕРЬЕЗНЫЕ $$$, $$$ экономии на CAPEX для новых серверов и лицензий БД, а также на контракты на поддержку крупных коммерческих проектов.

Майк Трест
источник
48
Как это отвечает на вопрос о различиях между этими двумя реализациями протокола memcache в php?
Marki555
9
Это должен быть комментарий.
Элайджа Линн
7

Memcached - более новый API, он также предоставляет memcached в качестве поставщика сеансов, что может быть полезно, если у вас есть ферма серверов.

После того, как версия все еще очень низкая 0,2, но я использовал оба, и я не столкнулся с серьезной проблемой, поэтому я бы пошел в memcached, так как он новый.

RageZ
источник
1
Оба фактически работают как обработчики сеансов, хотя я бы никогда не хотел использовать их для этого. us3.php.net/manual/en/memcache.examples-overview.php
Xeoncross
хорошо поймай мое плохо, да, это действительно очень полезно на большом сервере, когда становится очень важным, плюс memcache не проверяет, что он не уронит какой-то объект, чтобы получить память, настолько сложную для понимания, как масштабировать вещи.
RageZ
1
С тех пор версия 0.2 превзошла стабильную версию 1.0.0.
Миха Хрибар