Как эффективно аннулировать кеш?
Я пытался оптимизировать производительность одного программного обеспечения, основанного на php и mysql. Я прошел кеширование в Apache и индексы в MySQL, но этого недостаточно. Поскольку все формы в этом программном обеспечении создаются и распечатываются динамически из конфигурации в базе данных, программное обеспечение отправляет огромное количество SQL и выполняет много объединений, что замедляет процесс, когда подключено много одновременно работающих пользователей (в среднем 200-300).
Поскольку мы не можем прикоснуться к коду, я увидел, что mysql-прокси может быть размещен между сервером приложений и сервером базы данных, и там результаты кэширования могут быть кэшированы при доступе к redch o memchached через lua. Моя идея состоит в том, чтобы кэшировать все. Тем не менее, проблема делает кэш недействительным. После обновления записи, как сделать недействительными все кэшированные наборы результатов?
Одной из идей было преобразовать SQL-запрос в md5 и сохранить результат как ключ набора. Но также сделайте анализ запроса и сохраните тот же ключ md5 и ссылки на таблицу. Например:
Запрос:
select * from products left join users on products.user_id = user.id
Экземпляр кэша A
3b98ab273f45af78849db563df6598d1– {result set}
Экземпляр кэша B
products - 3b98ab273f45af78849db563df6598d1
users - 3b98ab273f45af78849db563df6598d1
Поэтому, как только для этих таблиц будет выполнено UPDATE, INSERT или DELETE, они аннулируют все результирующие наборы, в которых запрашивалась конкретная таблица.
Я вижу довольно много работы с ним, и мне было интересно, есть ли более простые методы для достижения этой цели.