Собственно, есть вопрос к тем, кто серьёзно на практике сталкивался с кэшированием в pylons.
Пишу небольшой проект навроде конференции. Есть связанные модели темы и сообщения.
Разумеется, хочется оптимизации в виде кэширования.
Проблема состоит в том, что, например, кэш содержащий себе всю тему, необходимо инвалидить, в момент добавления или удаления нового сообщения в этой теме. Так же поступать с кэшем тем. Сами пилонсы, как и алхимия, не предоставляют возможности использовать “из коробки” кэш внутри моделей.
Изучение доки по pylons, beaker, sqlalchemy дало следующие варианты реализации:
1. Низкоуровневое кэширование внутри модели.
Я описал небольшой класс для работы с beaker.cache, достающий параметры и производящий их инвалидацию, руководствуясь этим описанием.
Кстати, этот метод производит наименьшее количество запросов из всех.
2. Использовать beaker-кэширование в алхимии, как описано в примерах
Стоит отметить, что использовать конфиг из pylons внутри модели напрямую, при помощи
from pylons import config
3. Кэширование в контролёре.
Здесь применяются стандартные кэш-декораторы из pylons. Единственное, что мне пришлось сделать, это описать небольшую приватную функцию инвалидации внутри класса контролёра. Здесь стоит отметить, что кешируется результат выполнения функции в контролёре, а не запрос к базе, т.е. в момент вызова функции удаления\создания нового сообщения или ветви выполняются запросы по нахождению нужного объекта (однако, не сильно нагружающие базу, например, запрос по первичному ключу), тогда как при первом методе объект достаётся из кэша.
Итак, подводя итоги можно сказать следующее:
Наименьшее количество запросов к базе (т.е. наименьшая нагрузка) осуществляется при использовании первого метода, однако методы интеграции кеширования в саму модель требуют большего количества кода и изменения дефолтного поведения приложения.
Кэширование в контролёре требует небольшого вмешательства во внутренности приложения, однако оно менее эффективно, чем низкоуровневое.
Поэтому, вопрос.
Какой метод предпочтительнее использовать?
Какой метод не является по своей сути быдлокодерским, при этом сохраняя эффективность?
Существуют ли ещё какие-либо возможности решения данной проблемы?
Спасибо заранее всем.