Руководство по эффективному кэшированию в Django

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

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

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

В django в основном поддерживается 5 типов кэширования:

  • Кэширование Memcached
  • Кэширование базы данных
  • Кэширование файловой системы
  • Кэширование локальной памяти
  • фиктивное кэширование

Memcached

Кэширование Memcached — это тип кэширования, при котором данные хранятся в памяти. Кэширование памяти обеспечивает более быстрый способ извлечения данных. Несмотря на то, что это быстро, кэширование памяти является энергозависимым и может хранить только ограниченные данные. Чтобы использовать кэширование памяти в качестве серверной части, добавьте эту конфигурацию в файл settings.py. Memcached уже интегрирован в django, и для его использования вам необходимо установить memcached с pip следующим образом:

pip install memcached

Вам также необходимо установить библиотеку привязки python memcached с помощью pip.

pip install python-memcached

Затем добавьте конфигурацию кэширования в файл settings.py.

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',  
    }
}

Сервер Memcached теперь будет работать на локальном хосте через порт 1121. В производственной среде замените значение местоположения адресом вашего рабочего сервера.

Редис

Redis также является базой данных в памяти, используемой для кэширования. Redis использует сервер Redis. Чтобы использовать Redis в качестве кэша на локальном компьютере, вам необходимо запустить сервер Redis. Во-первых, установите Redis. Вы можете найти инструкции по установке здесь в зависимости от вашей операционной системы,

Затем настройте серверную часть RedisCache в файле settings.py.

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
    }
}

LOCATION определяет местоположение сервера Redis, который должен быть запущен и доступен вашему приложению django. Адрес 127.0.0.1:6379 означает, что Redis работает на локальном хосте с портом 6379 по умолчанию.

Вам также понадобится привязка python для Redis, например redis-py или hiredis-py.

pip install redis

Клиент Redis для Python позволяет вам взаимодействовать с сервером Redis с помощью кода Python.

Кэширование базы данных

При кэшировании базы данных кэшированные данные хранятся в базе данных. Кэширование базы данных не такое быстрое, как кэширование в памяти, но является постоянным кешем. Кэширование базы данных настраивается следующим образом в файле settings.py.

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.db.DatabaseCache",
        "LOCATION": "cache_table",
    }
}

LOCATION определяет таблицу базы данных, в которой будут храниться кэшированные данные. После настройки параметров создайте таблицу базы данных.

python manage.py createcachetable

Когда вы запустите приведенную выше команду, django создаст таблицу базы данных (cache_table), определенную в настройках CACHE.

Файловая система Кэширование

Кэширование файловой системы сохраняет данные в файловой системе. Кэширование файловой системы является постоянным, как и кэширование базы данных, но медленнее, чем кэширование в памяти, и неэффективно для хранения больших файлов.

Чтобы использовать кэширование файловой системы, добавьте конфигурации в файл settings.py.

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
        "LOCATION": "path_to_cache_file",
    }
}

Указанное местоположение должно быть абсолютным путем и должно быть создано, поскольку django его не создаст. Он также должен быть доступен для записи, т. е. ваше приложение django должно иметь необходимые разрешения для записи в кеш.

Локальная память

Локальная память — это тип кэширования памяти, при котором данные хранятся в том же процессе, что и ваше приложение django. Это также бэкенд кеша по умолчанию, используемый django, если не определен другой бэкенд кеша. И это так же быстро, как Memcached.

Этот тип кэширования подходит для разработки. Кэширование в локальной памяти настраивается, как показано ниже.

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
        "LOCATION": "my-cache",
    }
}

LOCATION определяет экземпляр кэша с именем my_cache.
Кэширование в локальной памяти неэффективно, поэтому его не рекомендуется использовать в производственной среде.

Фиктивное кэширование

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

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.dummy.DummyCache",
    }
}

Пользовательские серверные части

Django также поддерживает настраиваемые бэкенды, если ваши потребности не могут быть удовлетворены с помощью различных бэкэндов, которые мы рассмотрели выше. Чтобы использовать собственный бэкенд, укажите его, как показано ниже.

CACHES = {
    "default": {
        "BACKEND": "path.to.backend",
    }
}

Условия кэширования

Чтобы реализовать кэширование в вашем приложении django, вот некоторые термины кэширования, которые вам нужно знать, как использовать:

  • TIMEOUT : это время ожидания в секундах для кеша. Если не установлено, будет использоваться значение по умолчанию 300 секунд (5 минут).
  • KEY_PREFIX: Строка, добавленная к каждой клавише

Способы кэширования

После настройки кэширования вы можете применить кэширование ко всему сайту, к представлениям, шаблонам или использовать низкоуровневое кэширование.

Кэширование на сайте

Кэширование для каждого сайта означает кэширование всего сайта. Конфигурации выглядят следующим образом:

MIDDLEWARE = [
"django.middleware.cache.UpdateCacheMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.cache.FetchFromCacheMiddleware",
]

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

Просмотр кэширования

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

Чтобы сначала использовать кэширование представлений, импортируйте декоратор cache_page из django.views.decorators.cache.

from django.views.decorators.cache  import cache_page

Примените декоратор в представлениях функций и укажите время ожидания в секундах.

@cache_page(600)
def cached_view(request)
    #the rest of your code

Например, здесь мы кэшируем данные на 600 секунд (10 минут). Через 10 минут срок действия кэша истечет, и последующие запросы к представлению приведут к новому ответу, который будет снова кэшироваться на 10 минут, и цикл продолжится.

Фрагмент шаблона Кэширование

Django также позволяет кэшировать фрагменты шаблонов. Во-первых, загрузите тег кеша в верхней части файла шаблона, чтобы кэшировать фрагменты шаблона.

{% load cache %}

Затем поместите фрагмент, который необходимо кэшировать, в теги {% cache %} and {% endcache %} tags. Кэширование фрагментов принимает аргумент времени и еще одно необязательное имя аргумента, как показано ниже.

{% load cache %}
{% cache 600 products %}
    {% for product in products%}
       {{product .image.url}}
        {{product .title}}
        {{product .description}}
         {{product .price}}

    {% endfor%}
{% endcache %}

Например, кэш продуктов будет кэшировать фрагмент, содержащий сведения о продуктах, каждые 10 минут.

API низкоуровневого кэша

Иногда кэширование представлений, отдельных сайтов или шаблонов может быть не идеальным для часто меняющихся запросов. Django предоставляет низкоуровневый API кэширования, который позволяет кэшировать определенные запросы или объекты Python.

Django по умолчанию хранит все кеши в django.core.caches, а кеш по умолчанию хранится в cache из django.core.cache.

Вы можете установить и получить кеш. Установка кеша сохраняет данные в кеше с помощью ключа, а get извлекает данные из кеша, указывая ключ кеша.
Синтаксис метода set выглядит следующим образом:

cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None) 

Где :

  • key - ключ кэша
  • value — это объект Python, который будет храниться в кеше.
  • timeout — тайм-аут кеша в секундах. Если время ожидания не указано, по умолчанию будет установлено значение TIMEOUT, установленное в CACHE_BACKEND.
  • version является необязательным и определяет версию кэша.

Синтаксис метода get выглядит следующим образом:

cache.get(key, default=None, version=None)

где:

  • key - ключ кэша
  • default — это возвращаемое значение, если кеш не существует. по умолчанию None
  • version определяет версию кэша.

Давайте посмотрим, как установить и получить кеш.

>>> cache.set("product", {"name":"Product 1"}, 60)
>>> cache.get("product")
{'name': 'Product 1'}
>>> 

Здесь мы кешируем словарь с ключом “product” на 60 секунд. Затем мы снова извлекаем кеш.

Если вы попытаетесь получить данные из кеша через 60 секунд, он вернет None, так как срок его действия истек.

# wait for 60 seconds , then get the key again
>>> print(cache.get("product"))
None
>>> 

Чтобы удалить кеш, используйте cache.delete(key). Давайте снова добавим кеш и удалим его.

>>> cache.set("product", {"name":"Product 1"}, 60)
>>> cache.delete("product")
True
>>> print(cache.get("product"))
None
>>> 

Если вы удалите кеш, он вернет True, как показано выше, если кеш не существует, он вернет False.

Заключение

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

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .