Что такое memcached. Зачем это нужно.

Memcached — это программа (сервер) позволяющая кэшировать данные в оперативной памяти. Под многие языки программирования написаны клиентские библиотеки, которые выступают посредниками при работе с данным сервером.

Основные принципы работы с memcache объясним на примере:

$memcache = new Memcache;
// Подключаемся к серверу
$memcache->connect('localhost', 11211);
$value = 1;
//сохраняем значение $value на 10 сек
$memcache->set('key', $value, false, 10);
//Получаем значение
$get_result = $memcache->get('key');

Рассмотрим процесс установки memcahced под Windows (потребуются установленные php и Apache):

  1. Заходим на http://www.splinedancer.com/memcached-win32/ и скачиваем последнюю версию memcached binaries. На текущий момент это версия 1.2.4
  2. Распаковываем архив в любую папку на локальном компьютере. Например, с:\php5\mem\
  3. Устанавливаем memcached как службу. Для этого необходимо: Пуск->Выполнить и ввести команду ‘c:\php5\mem\memcached.exe -d install’
  4. Для запуска службы необходимо выполнить команду: ‘c:\php5\mem\memcached.exe -d start’
  5. По умолчанию служба работае 11211 порту
  6. Для работы с memcached из PHP скачиваем и устанавливаем соответствующие расширение php_memcache.dll (Копируем его в с:\php5\ext и дописываем в php.ini:
    [PHP_MEMCACHED]
    extension = php_memcache.dll)
  7. Перегружаем Apache. И все готово. Memcache можно использовать.

Преимущества Memcached покажу на следующем примере. Давайте попробуем закэшировать данные разными способами и попробуем замерить время их получения в каждом из случаев. В первом случае будем кэшировать массив из 1000 элементов, во втором — число.

Будем обращаться к БД, массиву сохраненному в файловой системе и сохраненному в memcached.

Количество обращений 1000.

Создадим массив:

$tarray = array();
for($i = 0; $i < 1000; $i++) {
$tarray[] = rand(1000, 99999);
}

Сохраним его в memcached и в серриализованном виде в файлике:

//Сохранение в Memcache
$memcache = new Memcache;
$memcache->connect('localhost', 11211)
    or die ("Could not connect");
$memcache->set('test', $tarray, false, 100)
    or die ("Failed to save data at the server");
$memcache->close();

//Сохранение в файлике
file_put_contents('test.data', serialize($tarray));

Для упрощения для выборки из MySQL будем использовать любую уже готовую таблицу.

Запускаем получение данных в цикле:

//получаем 1000 раз массив из файла
$mtime = microtime(1);
for($i = 0; $i < 1000; $i++) {
    $tarray2 = unserialize(file_get_contents('test.data'));
}
var_dump(microtime(1) - $mtime); 

//получаем массив из memcached
$mtime = microtime(1);
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
for($i = 0; $i < 1000; $i++) {
    $tarray2 = $memcache->get('test');
}
var_dump(microtime(1) - $mtime);
$memcache->close();

//получаем массив из MySQL
$mtime = microtime(1);
for($i = 0; $i < 1000; $i++) {
        $query = "SELECT SQL_NO_CACHE id FROM `table` WHERE id > ".$i." LIMIT 0,200;";
        $res = mysql_query($query) or die(mysql_error());
        $row = mysql_fetch_assoc($res);
}
var_dump(microtime(1) - $mtime);
mysql_close();

//Получаем массив из memcahced, но для каждого выбора будем заново
//открывать и закрывать соединение
$mtime = microtime(1);
for($i = 0; $i < 100; $i++) {
    $memcache = new Memcache;
    $memcache->connect('localhost', 11211) or die ("Could not connect");
        $tarray2 = $memcache->get('test');
        $memcache->close();
}
var_dump(microtime(1) - $mtime);

Код тестов можно скачать тут

В случае получения одной переменной.

Источник кэша Время, сек
Файл 1.67
memcache 0.36
mysql 1.45
memcache (но с постоянным коннектом к серверу) 43.92

В случае получения массива:

Источник кэша Время, сек
Файл 3.96
memcache 2.92
mysql 6.15
memcache (но с постоянным коннектом к серверу) 98

Выводы:

  • Memcache полезная технология и ее желательно использовать на нагруженных проектах
  • При использовании memcache большая часть времени уходит на подключение к серверу

Добавить комментарий

Ваш адрес email не будет опубликован.