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