Привет. Подскажи как можно реализовать кеширование результатов выдачи в магазине по определенны параметрам. Например есть 3 таблицы, books, authors и category и пользователь может выбирать на сайте книги каких авторов ему нужно отобразить, так же может выбирать в какой категории книги отобразить и еще например может год выбирать книги и все это он можно одновременно выбирать, и по этим параметрам ему должен показаться результат. Нужно реализовать систему кеширование результатов, если другой человек укажет те же параметры, то ему отобразиться результаты из кеша? Если ли смысл такое вообще делать? И как это можно реализовать? Никогда не встречал такой задачи и не видел статей в интернете по такой теме
Да, кэшировать списки из БД смысл имеет. Думайте о них как об обычных страницах, коими они и являются, со своими уник адресами. По адресам и кэшируйте.
Например можете кэшировать в файлах с такими именами (с учетом пагинации списков): books#0 или books#1, books#2 и т.д. – список книг books/1 и т.д. – книга с указанным id (1); тут вроде бы списка нет, но тоже можно кэшировать authors/1#0 или authors/1#1, authors/1#2 – список книг автора с указанным id (1) с category – аналогично.
Отличная идея, спасибо. Но насколько такие кеши живучие по времени, ведь если добавить новый товар, то и кем нужно обновлять
Да, кэш обычно чистится в админке при изменении соответствующих объектов или ветвей объектов. В наших сайтах в основном используется именно такой подход: переднеплановый движок кэширует, заднеплановый чистит кэш. --- Добавлено --- Про ветви – это когда, например, при редактировании книги 1 в ветке books, чистится не только books/1#..., но и books#..., и #... Но это, естественно, не охватывает все зависимости, поэтому ты можешь либо явно отслеживать все зависимости, либо чистить кэш целиком (фоновой задачей), когда происходит какое-то изменение. В общем тема не самая простая, но с чего-то нужно начинать.
А что делаете когда пользователь не только указывает параметры поиска (грубо говоря галочки ставит), а еще вводить в поиск фразу по которой нужно найти? Вы эту фразу добавляете в уникальные адреса, или вы игнорируете фразу ищите по галочкам, получаете идишки товаров и уже только по ним ищите какие товары соответствуют фразе?
На наших сайтах используется Post-Redirect-Get, например после POST-запроса выполняется редирект методом GET по адресу /search/тут_уник_код_поискового_запроса, т.е. непосредственно поиск уже выполняется при запросе методом GET по указанному адреса. P.S. Кэшироваться могут далеко не все страницы. Например, пользователь может делать кучу «тупых» поисковых запросов с пустыми результатами. И вы будете забивать этими пустышками память/диск? Нет, конечно. --- Добавлено --- P.P.S. В принципе можно делать запрос методом GET прямо с формы. Так параметры запроса будут передаваться в GET-параметрах (в URL-кодировке). --- Добавлено --- Поисковая фраза может относиться к разному контенту. Есть полнотекстовый поиск. Есть, например, просто поиск по названиям чего-либо. В последнем случае ты можешь частично обработать поисковый запрос еще на этапе POST-обработки, заменив поисковую фразу идентификатором искомого объекта (или списком идентификаторов, если их не оч. много, а фраза относилась сразу к нескольким объектам).