Собственно какие-то совсем "банальные" вещи мне известны (кэширование в шаблонах/запросов), смотрел разные батарейки.
Собственно, есть интернет магазин, с большими каталогами товаров. Можно кешироватьсами запросы, но проблемы возникают при генерации шаблонов, то есть почти все время занимает именно они - можно воспользоваться блочным кешем, но проблема в том, что некоторые каталоги мало посещаемы (4 в день), получается, что даже выставив время жизни 12 часов, каждый второй посетитель будет сталкиваться с долгим ожиданием.
Ок, можно "забить" на этих 4 пользователей, но допустим мне нужно в каталогах указывать если ли уже товар в корзине или нет. При таком раскладе кэш нужен для каждого пользователя - то есть по сути нужно держать каталоги для каждого юзера, + опять задержка при обновлении и первом заходе. Такая же ситуация с блогом, мне нужно указать сколько новых комментов появилось в посте с последнего посещения (аля хабр).
Собственно вопрос как кешировать большие блоки при этом сохранять в них индивидуальную информацию для каждого из юзеров, будь то "уже в корзине" или "+40 новых комментариев"? Где можно почитать углубленные материал как организовывать кэширование на сайтах в целом?
Мне кажется, что тормозит не рендер шаблонов, а что-то другое.
>Собственно вопрос как кэшировать большие блоки при этом сохранять в них индивидуальную информацию для каждого из юзеров
Перенести отображение этой информации на сторону JavaScript. Кэшируется блок html без изменяемых данных, а в браузере JS отдельно их устанавливает.
>получается, что даже выставив время жизни 12 часов, каждый второй посетитель будет сталкиваться с долгим ожиданием.
1. можно выставить время в 120 часов :-)
2. можно весь html генерировать на диск и раздавать статику, обновляя только во время обновления товаров.
3. написать скрипт, который будет периодически обходить сайт и инициировать кэширование.
Заодно рекомендую почитать про версионирование кэша.
Думаю, тормозит все же рендер, (не измерял профайлером), но если использовать "блочный кэш" в шаблонах, и обернуть только вывод товаров (не фильтер, ни другие элементы, только for с товарами) время отдачи сокращается с 800мс до 200мс.
Спасибо, про js думал, но на крупных сайтах сделано не через него, просто хочется понять, как большие сайты совмещают и общий кэш и индивидуальный.
>не измерял профайлером
Лучше всё-таки измерить. Или хотя бы посмотреть количество и тип запросов к базе. Я с трудом представляю, что может рендерится полсекунды.
>только for с товарами
сходу возможные проблемы:
- итарация по запросу *.objects.all() может вызывать несколько запросов (т.к. Джанго будет запрашивать данные по мере необходимости);
- для каждого товара могут вызываться дополнительные запросы при обращении к связанным с ним моделям (см. select_related)