В настоящее время я знаю только два способа кэширования данных (я использую PHP, но я предполагаю, что то же самое будет применяться к большинству языков).
- Сохранить кеш в файл
- Сохраните кеш в большое поле БД
Существуют ли другие (возможно, лучшие) способы кэширования или это действительно так просто?
Может быть, вы хотите более точно указать, что вы хотите кэшировать. У вас есть все эти возможности для кеширования:
- Доступ к базе данных, где вы кешируете данные, сначала корректно настраивает вашу СУБД, а затем использует слой, чтобы делегировать решение для обнаружения нескольких запросов на одни и те же данные (например, с AdoDB ).
- Извлечение вычислений из циклов в коде, чтобы вы не вычисляли одно и то же значение несколько раз. Вот ваш третий способ: сохранение результатов в сеансе для пользователя.
- Предварительная компиляция кода PHP с расширением, таким как APC Cache . Таким образом, вам не нужно компилировать один и тот же код PHP для каждого запроса.
- Страница отправлена пользователю, чтобы убедиться, что вы устанавливаете правильные мета-теги (сделайте хорошую вещь для всего мира и не используйте ETL, по крайней мере, абсолютно необходимо); или может сделать динамические страницы полностью статичными (имея пакетный процесс, который генерирует HTML-страницы); или используя прокси-кеш, такой как Squid .
- Предварительная выборка и под этим я ссылаюсь на все те возможности, которые у вас есть, чтобы улучшить взаимодействие с пользователем, просто делая вещи, пока пользователь не смотрит в вашу сторону. Например, предварительная загрузка тегов IMG в HTML-файл, настройка СУБД для предварительной обработки, предварительный расчет результатов, хранение сложных вычислений в базе данных и т. Д.
Исходя из моего опыта, могу поспорить, что ваш код может быть значительно улучшен, прежде чем мы начнем говорить о кешировании. Рассмотрим, например, насколько хорошо структурирована навигация на вашем сайте и насколько хорошо вы контролируете работу пользователя. Затем проверьте ваш код с помощью такого инструмента, как XDebug .
Проверьте также, насколько хорошо вы делаете свои запросы SQL и насколько хорошо вы индексируете свои таблицы. Затем проверьте свой код еще раз, чтобы найти возможности применить правило «читайте много раз, а пишите только один раз»
Используйте простой инструмент, такой как YSlow, чтобы подсказывать другие простые вещи для улучшения. Проверьте ваш код еще раз, ища возможности для размещения логики в браузере (через JavaScript)
Вы также можете кэшировать в памяти, что гораздо эффективнее. Попробуй memcached .
Отделение memcached, делает простые вещи хорошо и может стать дистрибутивом и прочим джазом, если вам это тоже нужно
Если вы используете Apache, вы можете использовать mod_rewrite для статического кэширования ваших веб-страниц. Допустим, вы используете PHP, и у вас есть запрос для "/somepage.php". В вашем файле .htaccess вы помещаете следующее:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^$ # let's not cache urls with queries
RewriteCond %{REQUEST_METHOD} ^GET$ # or POST/PUT/DELETE requests
RewriteCond static_cache/%{REQUEST_URI} -s # Check that this file exists and is > 0 bytes
RewriteRule (^.*$) static_cache$1 [L] # If all the conditions are met, we rewrite this request to hit the static cache instead
Если ваш кеш оказывается пустым, запрос обрабатывается вашим php-скриптом, как обычно, поэтому теперь просто нужно заставить ваш php-скрипт сохранять полученный html в кеше. Простейший способ сделать это - использовать другое правило htaccess для предварительного добавления конца и добавления нескольких файлов php ко всем вашим запросам php (это может или не может быть хорошей идеей, в зависимости от вашего приложения):
php_value auto_prepend_file "pre_cache.php"
php_value auto_append_file "post_cache.php"
Тогда вы бы сделали что-то вроде этого:
pre_cache.php:
ob_start();
post_cache.php:
$result = ob_get_flush();
if(!$_SERVER['QUERY_STRING']) { # Again, we're not caching query string requests
file_put_contents("static_cache/" + __FILE__, $result);
}
С некоторыми дополнительными регулярными выражениями в файле .htaccess мы, вероятно, могли бы также начать кэширование запросов строки запроса, но я оставлю это как упражнение для читателя :)