Уведомления

Группа в Telegram: @pythonsu

#1 Июль 29, 2010 01:05:12

hanyuu
От:
Зарегистрирован: 2010-07-29
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Кэширование в pylons+sqlalchemy

Здравствуйте.
Собственно, есть вопрос к тем, кто серьёзно на практике сталкивался с кэшированием в pylons.

Пишу небольшой проект навроде конференции. Есть связанные модели темы и сообщения.
Разумеется, хочется оптимизации в виде кэширования.
Проблема состоит в том, что, например, кэш содержащий себе всю тему, необходимо инвалидить, в момент добавления или удаления нового сообщения в этой теме. Так же поступать с кэшем тем. Сами пилонсы, как и алхимия, не предоставляют возможности использовать “из коробки” кэш внутри моделей.
Изучение доки по pylons, beaker, sqlalchemy дало следующие варианты реализации:
1. Низкоуровневое кэширование внутри модели.
Я описал небольшой класс для работы с beaker.cache, достающий параметры и производящий их инвалидацию, руководствуясь этим описанием.
Кстати, этот метод производит наименьшее количество запросов из всех.

2. Использовать beaker-кэширование в алхимии, как описано в примерах

Стоит отметить, что использовать конфиг из pylons внутри модели напрямую, при помощи

from pylons import config
не получится, поскольку объект конфига создаётся после вызова функции load_environment, которая так же инициализирует модель, т.е. в момент инициализации модели конфиг ещё не существует. Для решения этой проблемы, я парсирую конфиг внутри load_environment, а затем передаю его в инициализацию модели как дополнительный параметр. Иначе конфиг кэша модели будет отдельно от конфига всего приложения, что, как мне кажется, нежелательно.

3. Кэширование в контролёре.
Здесь применяются стандартные кэш-декораторы из pylons. Единственное, что мне пришлось сделать, это описать небольшую приватную функцию инвалидации внутри класса контролёра. Здесь стоит отметить, что кешируется результат выполнения функции в контролёре, а не запрос к базе, т.е. в момент вызова функции удаления\создания нового сообщения или ветви выполняются запросы по нахождению нужного объекта (однако, не сильно нагружающие базу, например, запрос по первичному ключу), тогда как при первом методе объект достаётся из кэша.

Итак, подводя итоги можно сказать следующее:
Наименьшее количество запросов к базе (т.е. наименьшая нагрузка) осуществляется при использовании первого метода, однако методы интеграции кеширования в саму модель требуют большего количества кода и изменения дефолтного поведения приложения.
Кэширование в контролёре требует небольшого вмешательства во внутренности приложения, однако оно менее эффективно, чем низкоуровневое.

Поэтому, вопрос.
Какой метод предпочтительнее использовать?
Какой метод не является по своей сути быдлокодерским, при этом сохраняя эффективность?
Существуют ли ещё какие-либо возможности решения данной проблемы?

Спасибо заранее всем.



Офлайн

#2 Июль 30, 2010 07:38:35

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Кэширование в pylons+sqlalchemy

Не скажу за рассматриваемые способы кэширования, не использовал. Но есть еще один - использование app_globals - вроде как дэ-факто считается стандартом кэширования для pylons. По крайней мере, я его пару раз успешно использовал в проектах. Хотя фактически это лишь улучшенная версия 3-го метода.

Ну а что касается 1-го метода, то возможно имеет смысл написать свою реализацию declarative base для sqlalchemy на основе стандартной, где и реализовать фичи, необходимые Вам для кэширования. По крайней мере напишите раз - сможете использовать во всех моделях.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version