Все статьи >> memcache vs memcached - сравниваем клиенты для PHP (просмотров: 1739)

memcache vs memcached - сравниваем клиенты для PHP

Какой клиент лучше использовать при разработке на PHP - php-memcached или php-memcache? Все зависит от того, какие особенности Вам нужны (неужели?). Давайте сравним в двух аспектах - функциональность и производительность.

Функциональность

Клиентская библиотека php-memcache была разработана еще в 2004 году и сегодня существует уже довольно стабильная версия, которая используется в 99.9% проектах (использующих сервер Memcache). Большим недостатком этой библиотеки является ее ограниченные способности - она реализует только часть протокола мемкеша, и не позволяет использовать его дополнительные возможности (какие именно - чуть ниже).

Библиотека php-memcached была разработана сравнительно недавно, но уже успешно используется на некоторых крупных проектах (например, digg.com - из которого и вышла эта разработка). Самое главное ее преимущество - это полная реализация протокола, в том числе:

  • CAS токены для версионирования ключей
  • Обратные вызовы (callbacks)
  • Метод getDelayed() позволяющий уменьшить время ожидания откладывая фактическое чтение ключей
  • Поддержка бинарного протокола
  • Возможность избежать сериализации используя igbinary

Производительность

Теперь давайте сравним производительность на практике.
Для этого напишем небольшой скрипт, который делает одинаковые операции с обоими клиентами:

addServer('localhost');

$md = new Memcached();
$md->addServer('localhost', 11211);

echo "Test operations: {$ops}";
echo "

get test

"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $m->get( md5(rand(1000, 99999)) ); echo "Memcache: " . ($res['memcache']['set'] = microtime(true) - $s ) . "
"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $md->get( md5(rand(1000, 99999)) ); echo "Memcached: " . ($res['memcached']['set'] = microtime(true) - $s ); echo "

set test

"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $m->set(md5(rand(1000, 99999)), 2); echo "Memcache: " . ($res['memcache']['get'] = microtime(true) - $s ) . "
"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $md->set(md5(rand(1000, 99999)), 2); echo "Memcached: " . ($res['memcached']['get'] = microtime(true) - $s ); echo "

delete test

"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $m->delete(md5(rand(1000, 99999))); echo "Memcache: " . ($res['memcache']['delete'] = microtime(true) - $s ) . "
"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) $md->delete(md5(rand(1000, 99999))); echo "Memcached: " . ($res['memcached']['delete'] = microtime(true) - $s ); echo "

combined test

"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) { $key = md5(rand(1000, 99999)); $m->set($key, 2); $m->get($key); $m->delete($key); } echo "Memcache: " . ($res['memcache']['combined'] = microtime(true) - $s ) . "
"; $s = microtime(true); for ( $i = 0; $i < $ops; $i++ ) { $key = md5(rand(1000, 99999)); $md->set($key, 2); $md->get($key); $md->delete($key); } echo "Memcached: " . ($res['memcached']['combined'] = microtime(true) - $s );

Как видно, скрипт просто выполняет основные операции сохранения, чтения и удаления ключей 10 тыс. раз и замерает их время для каждого клиента.

Результаты работы теста

Как видно из графика, производительность клиента php-memcache почти втрое выше, чем php-memcached. Следует учесть, что показатели при работе с бинарным протоколом почти не отличалась по времени от ASCII протокола.

Обновление

Благодаря внимательному читателю этого блога удалось выяснить, что сильные отличия в показателях тестов связаны с конкретными версиями и настройками библиотек. Проверка на других платформах дает отличие в производительности не более 10%.

В качестве вывода следует сказать, что клиент php-memcache лучше использовать, если функционала приложению полностью хватает (лучше, т.к. он быстрее). Если нужны расширенные возможности, то нужно использовать php-memcached. Но в этом случае нужно учесть понижение производительности.

Хотя важно заметить: даже не смотря на трехкратное различие в скорости работы, операции общения с сервером Memcache обычно занимают доли процента от времени исполнения приложения. Различие в скорости работ библиотек может быть заметно только при массовой работе с кешом, или же на огромных объемах данных.


Автор: Den Golotyuk
 
 
Email:
не зарегистрированы?
Пароль:
забыли?
 
Астраханские магазины