Как реализовать механизм очистки кэша?

Ситуация. Один из наших старых проектов начал нагружать mysql сервер. В нем 40 тыс. Товаров, и посещаемость 12 тыс в день. Основная нагрузка составлял фильтр товаров в каталоге. Стоимость товара формируется на основе 8 моделей ценообразования, которые имеют свой набор зависимостей. Я переваирив индексы, добавил отсутствуют, удалил лишние. Сайт начал работать в несколько раз быстрее. Драйвер PDO. Дополнительно я решил кэшировать mysql запросы и результаты. Механизм кэширования работает следующим образом:
Перед запросом в БД, осуществляется проверки присутствует файл в папке кэша. Если так, вытягивается содержимое файла. Строение файла: имя файла - md5 от sql запроса, содержимое файла - сериализованные массив из двух параметров. Первый - срок действия кэша (expired), второй содержание результата sql запроса (result). Кэширование работает классно. Но. Как мне реализовать механизм автоматической очистки кэша при редактирования товара или категории в тех местах, где они используются. Система модульная. Один и тот же товар может присутствовать в результатах поиска, в быстром поиске, при просмотре категории итп. Сейчас просто в админке кнопка очистить кэш, которая удаляет все кэш. Кэш пишется на 12 часов. Возможно в вас есть какие мысли, как это можно усовершенствовать. Спасибо
  • Вопрос задан
  • 2457 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
имя файла - md5 от sql запроса, содержимое файла - сериализованные массив из двух параметров

Поздравляю, вы почти изобрели штатный для mysql Query cache, он работает абсолютно так же, только в памяти. Зато у которого нет проблем с инвалидацией результатов и некешируемыми запросами.

Как кеширование делается нормально: у нормального кеширования нет времени жизни. Вообще. Нормально работающий кеш инвалидируется только по внешним условиям (что-то изменили в товаре - инвалидировали). Или по LRU (т.е., память кончилась)
Кешируете товары каждый отдельно от других. Инвалидируются потому элементарно, что изменилось - того и сбрасываете. А чтобы не было пары сотен промахов кеша на ровном месте - то наоборот, не инвалидируете кеш - а обновляете его.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Насколько я вижу, этот кэш на 99% кэшрует то что не нужно кэшировать.

Рекомендую сначала научиться работать с БД, и отладить работу с ней, чтобы в 99% случаев кэш не требовался вовсе.
После этого отпрофилировать приложение, понять узкие места, и оптимизировать их.
И только после этого, если даже разумная оптимизация не помогает - начинать что-то кэшировать.

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

При этом ни к PDO, ни к php-fpm вопрос отношения не имеет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы