Лучший способ кэширования результатов запросов, которые изменяются нечасто

У меня есть веб-приложение php, где определенные данные изменяются еженедельно, но часто читаются очень часто.

SQL-запросы, которые извлекают данные и php-код для вывода html, довольно сложны. Существует несколько табличных объединений и многочисленные вычисления, но они приводят к довольно простой таблице html. Пользователи сгруппированы, а таблица одинакова для каждой группы каждую неделю, но различна для разных групп. Я могу потенциально иметь сотни таблиц для тысяч пользователей.

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

Мне было бы интересно узнать, какие методы вы использовали успешно или безуспешно, чтобы добиться чего-то подобного?

Параметры, которые я вижу, включают:

  • Сохранение html-результата вычислений в таблице MySQL, идентифицированное группой пользователей
  • Сохранение результирующих данных в таблице MySQL, идентифицированных группой пользователей (трудно, поскольку нет фиксированного количества элементов данных)
  • Кэширование вывода страницы в статических файлах

Любые другие предложения приветствуются!

Есть действительно несколько вариантов:

  • Prerender страницы на еженедельной основе, а затем служить им «статически».
  • Используйте кеш (например, Squid ) для кэширования таких ответов по первой возможности в течение недели. Например, вы можете настроить политику кэширования, поэтому запросы, которые переходят на определенную страницу (например, very_long.php? …), кэшируются отдельно от остальной части веб-сайта.
  • Убедитесь, что вы включили кеширование DB. MySQL имеет собственный кеширование, и вы можете настроить его так, чтобы повторные длинные запросы не пересчитывались.

В функции для создания таблицы сделайте это сохранение результата в файл на диске:

/cache/groups/1.txt /cache/groups/2.txt 

Вам необязательно запускать недельное пакетное задание для него, когда вы вызываете функцию для получения данных, проверьте, не устарел ли кеш (или отсутствует). Если это так, тогда генерируйте и кэшируйте результаты. Если нет, просто верните кешированный файл.

 function getGroupTable($groupId) { if (cacheIsStale($groupId)) { generateCache($groupId); } return file_get_contents($cacheFile); } 

Функция cacheIsStale() может просто посмотреть временные метки файла, чтобы проверить свежесть.

в первую очередь, профиль. убедитесь, что эти запросы действительно потребляют значительное количество времени. возможно, кэш запросов запросов MySQL уже выполнил эту работу для вас.

если они действительно потребляют ресурсы, то я бы сделал, чтобы создать таблицу с вычисленными результатами и процедуру, требующую управления, которая будет вызываться при изменении данных. эти частые чтения должны поступать только на предварительно вычисленные данные, не утруждая себя проверкой, действительно ли он действителен.

просто добавьте некоторые крючки в процедуры, которые изменяют базовые данные или триггеры базы данных, если это возможно, они будут выполняться нечасто (еженедельно?) и могут занять много времени для получения каких-либо результатов.

Кажется, у вас уже есть большая часть этого.

Еще один вариант, предполагающий, что данные таблицы невелики, заключается в использовании memcache для кэширования результатов – вероятно, это будет более быстрое решение, хотя вам нужно будет проверить требования к памяти, чтобы убедиться, что это жизнеспособный вариант.