У меня есть один серверный сайт, который толкает 200 тыс. Экз. В день, а трафик удваивается примерно каждые 40 дней (в течение последних 5 месяцев в любом случае).
Я почти полностью планирую кэшировать вывод функций mysql_query в течение часа или около того. Если кеш старше этого, запустите запрос, верните результат обратно в кеш в течение еще одного часа.
Моя база данных mysql имеет размер около 200 МБ (увеличивается на 10-20 мб / месяц).
Im делает много кэширования файлов, записывая выходы HTML и используя их в течение нескольких минут, а затем восстанавливая html.
К сожалению, с его сайта базы данных, который позволяет использовать многие методы сортировки, поиска и упорядочения, а также разбиение на страницы …. Есть более 150 000 кешированных страниц. Im также не кэширует поисковые запросы, которые вызывают большую часть нагрузки.
Я хотел бы реализовать систему кеширования, и я хотел бы знать, какой из них быстрее. Хотелось бы увидеть некоторые ориентиры.
Быстрый Googling говорит, что APC в 5 раз быстрее, чем Memcached.
Мой опыт говорит о том, что APC почти в 7-8 раз быстрее, чем Memcached .. но к memchached могут быть доступны различные службы (например, если вы запускаете главным образом apache и делегируете некоторый трафик, например статическое содержимое, например изображения или чистый html, другой веб-сервис, такой как lighttpd), который может быть действительно полезен, если не незаменим.
APC имеет меньше возможностей, чем memcached, и его легко использовать и оптимизировать, но это зависит от ваших потребностей.
Как вы уже упоминали, есть несколько различных аспектов кеширования. Я, вероятно, сосредоточусь на следующих аспектах кэширования в вашем приложении php:
кэширование кода операции, которое кэширует скомпилированный байт-код скриптов php. Здесь вы можете увидеть эталон (хотя и в старой статье): http://itst.net/654-php-on-fire-three-opcode-caches-compared Примечание. Я настоятельно рекомендую использовать кеширование кода операции.
Кэширование пользовательских данных – APC и другие делают это. Это будут ваши справочные данные или данные, которые являются довольно статичными и не меняются часто. Вы можете очищать кеш каждый день или запускать чистый кеш при изменении этих эталонных данных. Это также настоятельно рекомендуется, поскольку обычно ссылочные данные используются часто и часто не меняются.
Кэширование sql-запросов – я знаю, что Zend упрощает эту задачу с простой настройки. Поскольку эти запросы не меняются, это еще один очевидный (как вы упомянули)
Дополнительно (если возможно):
кэширование html-страниц – очевидно, кеширование статической страницы происходит быстрее, чем сгенерированное, и, как правило, это сложно сделать, поскольку большинство страниц в приложениях настолько динамичны. Стоит это сделать, если вы можете это сделать, хотя если ваши запросы кэшируются и ваш SQL-код прост, я бы не сосредоточился на этом.
Кэширование результатов sql – лично я держусь подальше от этого. Я позволю базе данных выполнять свою работу и что она делает лучше всего, поскольку СУБД обычно имеет кеширование. Я могу кэшировать результаты для потока выполнения (т. Е. Я только что получил это, так что не делайте этого снова), но я не пойду намного дальше этого.
Я успешно использовал APC и eAccelerator (мне лично нравится работать с APC и предполагаемое кэширование кода операции и кэширование пользовательских данных для моих ссылочных данных и запросов sql). Используйте XDebug для описания вашего кода.
Вы хотите сравнить хранилище ключевых значений APC и Memcache? Поскольку APC также выполняет кеширование операций, это совсем другое.
Ну, на одной машине кеш-память APC намного быстрее, чем memcache. Memcache имеет больше функциональности, но предназначен для распределенных сред, в то время как APC работает только на одном сервере.
Недавно я сделал тест, чтобы установить, а затем получить 1 миллион ключей в обоих, каждый ключ был последовательным целым числом, а значения были 32-байтной строкой.
Через localhost memcache может извлекать 12k ключей / секунду в одном потоке. APC вернул 90K / секунду. Однако, если вы используете многопоточность или «multi_get» с memcache, он очень близок к производительности APC.
Тест проходил на 1GB vps на slicehost.
в моем случае apc в 59 раз быстрее, чем memcache
<?php ini_set('apc.enable_cli','1'); //if u run in cli you may need to do changes in php.ini error_reporting(E_ALL); $mem=new Memcache(); $mem->connect('127.0.0.1',11211); $mem->replace('testin','something'); $i=0; $time=time()+microtime(); apc_store ( 'testin','something'); $num=1000000; while($i<$num){ $mem->get('testin'); $i++; } echo "memcache took: ",time()+microtime()-$time," for 1 million gets","\n"; $time=time()+microtime(); $i=0; print_r(apc_fetch('testin')); while($i<$num) { apc_fetch('testin'); $i++; } echo "apc took: ",time()+microtime()-$time,"for 1 million gets \n";
вот результат
memcache took: 37.657398939133 for 1 million gets somethingapc took: 0.64599800109863for 1 million gets
Почти невозможно точно предсказать, что будет быстрее. Я бы запускал тесты как в среде разработки с аналогичными данными.
Когда производительность важна, всегда используйте профилировщик.
Im использует IPB 3.1.4 с APC, он работает просто в два раза быстрее, чем без него.
Requests per second: 43.46 [#/sec] (mean) Requests per second: 24.23 [#/sec] (mean)
Не тестируйте IPB с memcached еще