Какие основные стратегии кеширования предоставляет Django

Ответ

Django предлагает многоуровневую систему кеширования для значительного повышения производительности путем сохранения результатов ресурсоемких операций. Можно кешировать как отдельные фрагменты данных, так и целые страницы.

Основные стратегии:

  1. Кеширование на уровне всего сайта (Per-Site Caching)

    Самый простой способ. Django кеширует все страницы, которые не изменяются для разных пользователей. Включается добавлением django.middleware.cache.UpdateCacheMiddleware и django.middleware.cache.FetchFromCacheMiddleware в MIDDLEWARE.

  2. Кеширование на уровне представления (Per-View Caching)

    Применяется к отдельным представлениям с помощью декоратора cache_page. Идеально для страниц, которые обновляются редко.

    from django.views.decorators.cache import cache_page
    from django.http import HttpResponse
    import datetime
    
    # Кешировать результат этого представления на 15 минут
    @cache_page(60 * 15)
    def my_view(request):
        now = datetime.datetime.now()
        return HttpResponse(f"Page rendered at {now}")
  3. Кеширование фрагментов шаблона (Template Fragment Caching)

    Позволяет кешировать только определенные части шаблона с помощью тега {% cache %}. Полезно, когда страница в целом динамическая, но некоторые ее блоки (например, навигация, сайдбар) статичны.

    {% load cache %}
    
    {# Кешировать сайдбар на 1200 секунд (20 минут) #}
    {% cache 1200 sidebar %}
        <!-- Сложная логика для генерации сайдбара -->
        ...
    {% endcache %}
  4. Низкоуровневый API кеша (Low-Level Cache API)

    Дает полный контроль над тем, что и как кешировать. Можно сохранять результаты любых вычислений, запросов к базе данных и т.д.

    from django.core.cache import cache
    
    def get_heavy_data():
        data = cache.get('my_heavy_data_key')
        if data is None:
            # Данных в кеше нет, вычисляем их
            data = ... # ресурсоемкая операция
            # Сохраняем в кеш на 1 час
            cache.set('my_heavy_data_key', data, 3600)
        return data

Для работы кеша необходимо настроить бэкенд в settings.py (например, memcached, redis или кеш в базе данных).

Ответ 18+ 🔞

Ну, слушай, а знаешь, что в Django есть такая штука, чтобы всё не тормозило, как старая телега? Это кеширование, блядь! Всё, что считается долго, можно просто запомнить и не пересчитывать каждый раз. Просто сказка, а не инструмент, ёпта!

Смотри, как это работает, нахуй:

  1. Кешировать весь сайт (Per-Site Caching) Это как самый тупой, но иногда самый действенный способ. Сказал системе: «Запомни всё, что отдаёшь, и не парься». Включается двумя строчками в настройках, и всё, блядь, страницы начинают летать. Правда, годится только если у тебя сайт для всех одинаковый, без «Привет, Вася» в шапке.

  2. Кешировать отдельные вьюхи (Per-View Caching) А вот это уже тоньше. Накинул декоратор на функцию, которая рендерит страницу, и вуаля — результат её работы запоминается. Идеально для всяких «О нас» или прайс-листов, которые меняются раз в год, если повезёт.

    from django.views.decorators.cache import cache_page
    from django.http import HttpResponse
    import datetime
    
    # Сказали: «Запомни результат этой вьюхи на 15 минут, и не еби мозг»
    @cache_page(60 * 15)
    def my_view(request):
        now = datetime.datetime.now()
        return HttpResponse(f"Страница отрендерена в {now}")

    Теперь, пока кеш не протухнет, все будут видеть одно и то же время, как бы они ни обновляли страницу. Магия, блядь!

  3. Кешировать куски шаблона (Template Fragment Caching) Это вообще хитрая жопа! Представь: страница в целом динамическая, но вот этот чёртов сайдбар с кучей запросов к базе генерируется три часа. Так зачем его каждый раз пересчитывать? Обернул этот кусок в шаблоне специальным тегом — и он закешировался отдельно. Гениально же!

    {% load cache %}
    
    {# Говорим: «Эту панельку запомни на 20 минут, ключ — 'sidebar'» #}
    {% cache 1200 sidebar %}
        <!-- Тут какая-то адская логика для сайдбара -->
        ...
    {% endcache %}
  4. Низкоуровневый API (Low-Level Cache API) А это, блядь, для настоящих гурманов, когда хочется контролировать каждый чих. Хочешь запомнить результат суперсложного расчёта или тяжёлого запроса к базе? Пожалуйста! Берёшь и работаешь с кешем как со словарём.

    from django.core.cache import cache
    
    def get_heavy_data():
        # Пробуем достать из кеша по ключу
        data = cache.get('my_heavy_data_key')
        if data is None:
            # Опа, в кеше пусто! Значит, надо посчитать по-честному.
            data = ... # Тут твоя ресурсоёмкая операция, от которой сервер плачет
            # А теперь сохраняем это добро в кеш на час, чтобы больше не страдать
            cache.set('my_heavy_data_key', data, 3600)
        return data

Только не забудь, чувак, для всего этого великолепия в settings.py надо настроить бэкенд — сказать системе, куда это всё запоминать. В memcached, в redis или, на худой конец, в саму базу данных. Без этого вся твоя возня — просто пиздёж, а не оптимизация.