Быстрее, ещё быстрее!

Все хотят выжать из своих приложений максимум производительности. Общепринятые техники это - оптимизация и кеширование. Про один из вариантов оптимизации - запросов к базе, я уже писал, а вот про кеширование ещё нет. Сейчас хочу рассказать о некоторых способах кеширования, которые почерпнул из джанго сообщества, помимо конечно стандартных средств, их вы и так прекрасно знаете:)

Кеширование шаблонных тегов

Интересный метод, который позволяет кешировать результат работы шаблонного тега, особенно актуален для разного вида inclusion тегов. Пример реализации предложил Маньяк в своём форуме вот тут. Основной проблемой как всегда является инвалидация и уникальный идентификатор записи. В данном случае первая решается выставление таймаута, вторая определением специальной функции, которая должна сгенерировать уникальный идентификатор.

Всё хорошо, но требовать инвалидацию по таймауту это не интересно. Гораздо интереснее сбрасывать кеш, когда действительно изменились данные. Отсюда следующая концепция.

Инвалидация кеша с помощью сигналов

Это интересная идея принадлежит Сергею Кириллову(хотя конечно наверно не ему одному она пришла в голову, просто попался на глаза именно его вариант), которую он озвучил в django-developers Суть простая - сбрасывать кеш, по пришествию какого-либо сигнала. Просто и со вкусом, но почему-то не получила большого отклика по горячим следам в том треде.

Если развить и унифицировать, то может получиться очень интересно и практично. Всё хочу этим заняться, но как всегда, руки не доходят.

Ещё быстрее

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

Схожую концепцию, но немного другую, и как мне кажется, более продвинутую, реализацию предложил совсем недавно некий SuperJared. Тоже любопытно и заслуживает внимания.

Хотя конечно варианты кеширования целиком страницы интересны, но зачастую мало применимы на практики из-за большого числа динамических элементов и резонного желания, чтобы они были всегда актуальны:)

Вот такие вести с полей борьбы за производительность. Я думаю, что некое комплексное решение, из всех предложенных концепций, поможет действительно сделать джанго ещё быстрее чем есть. Меня пока очень заинтересовала инвалидация кеша сигналами. Уж больно лаконичным может получиться код и логика приложения при использовании такого метода.

А вы какие техники кеширования используете?

Комментарии 10

  1. Александр Кошелев написал:

    но пока сигналы - не самый быстрый штук. :\

    В смысле?

    Оставлен 09 Январь 2008 в 12:44
  2. Александр Кошелев написал:

    Кстати, вместо моего того InformerNode я уже бы порекомендовал родную кешилку фрагментов: http://www.djangoproject.com/documentation/cache/#template-fragment-caching . Возможности те же: она умеет кешировать кусок шаблона с ключом по набору параметров из контектса.

    Да. Но и тег бы не мешало уметь кешировать, так что надо совместно применять их. Просто, мне кажется, это более наглядно и гибко.

    Оставлен 09 Январь 2008 в 12:47
  3. Александр Кошелев написал:

    Ну так там притензия к post_init фактически. Ещё бы, несколько тысячь объектов, понятно дело, что это долго. Но pre/post_save дергаются не так часто, а иммено они интересны в данном контексте

    Оставлен 09 Январь 2008 в 13:32
  4. Александр Кошелев написал:

    Вот тут интересный вариант. Под апач и nginx.

    Ага. Спасибо. Знаем. Следим внимательно за развитием событий:)

    Оставлен 29 Январь 2008 в 02:58
  5. Сергей Кириллов написал:

    Смотрю заголовок поста и думаю "О, интересно как ещё люди решают вопрос". Захожу, а тут и про мой декоратор вспомнили ;) Приятно.

    У меня сейчас есть идея попробовать сделать кеширующий тег с отложенным вычислением, чтобы вместо 20ти раундтрипов в кеш был один. Но пока это только на уровне идеи.

    Оставлен 06 Март 2008 в 14:01
  6. Сергей Кириллов написал:

    Коменты барахлят ;)

    При отсылке показывает 500 Internal Server error

    Оставлен 06 Март 2008 в 14:30
  7. Александр Кошелев написал:

    Смотрю заголовок поста и думаю "О, интересно как ещё люди решают вопрос". Захожу, а тут и про мой декоратор вспомнили ;) Приятно.

    Вот скоро пост напишу и про расширенную реализацию этой идею.

    Оставлен 06 Март 2008 в 14:32
  8. Сергей Кириллов написал:

    Ага, уже прочитал, но пока не понял чем это отличается от того что я в джанго-девелоперс постил. Есть какой-то код который можно посмотреть?

    Оставлен 06 Март 2008 в 14:37
  9. Александр Кошелев написал:

    Ага, уже прочитал, но пока не понял чем это отличается от того что я в джанго-девелоперс постил. Есть какой-то код который можно посмотреть?

    Будет. В посте:) Всё никак не могу времени выкроить для него.

    Оставлен 06 Март 2008 в 14:41
  10. Сергей Кириллов написал:

    Ok. Ждём... ;)

    Оставлен 06 Март 2008 в 14:43