Лучший метод для кэширования результатов из запросов, которые изменяются нечасто - PullRequest
6 голосов
/ 23 марта 2009

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

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

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

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

Опции, которые я вижу, включают:

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

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

Ответы [ 4 ]

6 голосов
/ 23 марта 2009

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

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

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

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

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

5 голосов
/ 23 марта 2009

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

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

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

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

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

2 голосов
/ 23 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...