Март 14, 2008 в 15:58 |
caching
django
python
web
оптимизация
- Автор Александр Кошелев |
|
Всегда приятно видеть отзыв на своё творение. А особенно, когда он исходит от очень уважаемого мною человека - Ивана Сагалаева. Спасибо. В своём посте он высказал несколько очень точных замечаний по теме моего поста об инвалидации кеша сигналами. Изложу своё видение тезисов Ивана.
Декларативность действительно была моей целью. Поскольку джанга сама в очень многих местах декларативна, то конечно хотелось инструмент выдержанный в том же стиле, но не теряющий от этого функциональности.
Ситуация с многоэтажными декораторами меня тоже напрягает, и сейчас например файл, где хранятся шаблонные теги для этого блога, напоминает действительно urls.py в случае массового использования generic views.
Решение одно - разделить функционал и мета информацию инвалидации. Т.е. грубо говоря принудительно применять декоратор в старом синтаксисе "функция=декоратор(функция)". Тут то как раз и идея с одним "инвалидационным" файл пригодится.
В конце концов, моя реализация лишь proof of concept идеи сигнальной инвалидации. Как мне кажется, вот этот самый "proof" получился. Оно работает! Понятно, что в отдельных конкретных проектах, она может ...
Март 9, 2008 в 03:17 |
caching
django
signals
оптимизация
проекты
- Автор Александр Кошелев |
|
Так. продолжаем процесс употребления кеширования, основанного на сигналах в django. О теории уже было сказано достаточно, перейдем к практике, а для этого немного пофантазируем.
Итак, у нас есть приложения блога и в нем такие модели:
class Post( models.Model ):
title = models.CharField(max_length=100)
date = models.DateTimeField(default=datetime.now)
text = models.TextField()
class Comment( models.Model ):
post = models.ForeignKey( Post, related_name = "comments" )
text = models.TextField()
Теперь как полагается в хорошем блог движке, мы хотим получить последние 5 постов для того чтобы сообщить о них постетителю. Для этого напишем простую функцию
def get_latest_posts():
return Post.objects.all().order_by( "-date" )[ :5 ]
Отлично, функция готова и мы её можем применять в нужном нам месте. Но зачем каждый раз мучить базу и просить её вернуть последние посты? Ведь пишу то я не часто (ну так получается:)), поэтому можно это дело закешировать и не тратить ресурсы попусту, т.к. они не часто обновляются.
Но классический вариант с таймаутом тут не очень удобен: если сделать ...
Февраль 19, 2008 в 00:09 |
caching
django
signals
web
оптимизация
- Автор Александр Кошелев |
|
Как я обещал ранее, реализация кеширования с инвалидацией по-средствам сигналов - стала моей целью на прошедших каникулах. И была сделана в легкой и непринужденной атмосфере благополучия и меланхолии(я в первые с первого курса заработал стипендию!:)).
Как вы поняли из заголовка, этот пост лишь начало моего повествования об этой концепции и её первичной реализации. Сейчас я расскажу об особенностях такого подхода к инвалидации, проблемах, достоинствам, ну и конечно некоторых результатах.
Ещё хочу отметить, что система уже некоторое время успешно применяется в данном блоге.
Кратко суть. Идея состоит в том чтобы кеш протухал не по таймауту, а при возникновении некоторого события, которое порождает сигнал, который потом обрабатывается и может справоцировать инвалидацию. Следовательно данный подход должен быть боле логичен и более оптимален чем классический. Поскольку использование таймаута может быть неэффективено, когда периодичность изменения не детерминирована. Либо получается, что кеш слишком часто обновляется, либо наоборот долго висит старый. Первый вариант сказывается на производительности, а второй на актуальности информации, которую получает пользователь сайта. И того ...
Январь 8, 2008 в 02:52 |
caching
db
django
signals
snippets
web
- Автор Александр Кошелев |
|
Все хотят выжать из своих приложений максимум производительности. Общепринятые техники это - оптимизация и кеширование. Про один из вариантов оптимизации - запросов к базе, я уже писал, а вот про кеширование ещё нет. Сейчас хочу рассказать о некоторых способах кеширования, которые почерпнул из джанго сообщества, помимо конечно стандартных средств, их вы и так прекрасно знаете:)
Кеширование шаблонных тегов
Интересный метод, который позволяет кешировать результат работы шаблонного тега, особенно актуален для разного вида inclusion тегов. Пример реализации предложил Маньяк в своём форуме вот тут. Основной проблемой как всегда является инвалидация и уникальный идентификатор записи. В данном случае первая решается выставление таймаута, вторая определением специальной функции, которая должна сгенерировать уникальный идентификатор.
Всё хорошо, но требовать инвалидацию по таймауту это не интересно. Гораздо интереснее сбрасывать кеш, когда действительно изменились данные. Отсюда следующая концепция.
Инвалидация кеша с помощью сигналов
Это интересная идея принадлежит Сергею Кириллову(хотя конечно наверно не ему одному она пришла в голову, просто попался на глаза именно его вариант), которую он озвучил в ...