Кэширование приложения Django с помощью Redis

Источник баннера

Введение

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

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

Наглядное представление функциональности кэша браузера


Источник изображения: Pressidium

Узнать больше о функциональности кэша браузера можно здесь

Начало работы

Чтобы реализовать кэширование в приложении Django. Сначала настройте ваш проект Django и приложение. Затем установите django-redis, проект от Jazzband:

pip install django-redis
Войдите в полноэкранный режим Выйти из полноэкранного режима

В файле settings.py добавьте следующую конфигурацию:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {  
          "CLIENT_CLASS":"django_redis.client.DefaultClient",         
        }
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете добавить больше конфигураций, как указано в документации к пакету.

Реализация кэширования в представлениях

В данном случае функциональность кэширования будет реализована в представлении в API электронной коммерции, который я разработал, вы можете ознакомиться с ним здесь

from rest_framework.views import APIView
from django.core.cache import cache

class ProductDetailView(APIView):

   def get(self, request, *args, **kwargs):
       productID = kwargs['pk']
       if cache.get(productID):
          product = cache.get(productID)
          print("Cache hit")
       else:
           try:
             product = Product.objects.get(pk=productID)
                cache.set(productID, product)
                print("Cache miss")
           except Product.DoesNotExist:
                return Response(status=404)
       serializer = ProductSerializer(product, many=False)
       return Response(serializer.data)

Вход в полноэкранный режим Выход из полноэкранного режима

В приведенном выше коде, когда запрос выполняется к маршруту ProductDetailView, базе данных будет предложено извлечь продукт на основе productID. При повторном запросе консоль выведет Cache hit и будет использовать данные, сохраненные до запроса, для предоставления клиенту.

При появлении нового запроса в последующей очереди консоль выдаст Cache miss, поскольку до выполнения запроса никакие данные о нем не были кэшированы. Следовательно, база данных будет запрошена снова, и back-end обработает новый запрос. В противном случае будет выдан код 404, сигнализирующий о том, что модель продукта не существует; следовательно, никакие данные не могут быть получены.

Заключительное замечание

В производстве конфигурация кэша в файле settings.py потребует изменений в зависимости от используемого кэш-сервиса.
Пример ниже — развертывание на heroku:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": os.getenv('REDIS_URL'),
        "OPTIONS": {
          "CLIENT_CLASS":"django_redis.client.DefaultClient",
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Местоположение изменяется в соответствии с url кэш-сервиса, например ElastiCache от AWS.

Оцените статью
Procodings.ru
Добавить комментарий