Comment mettre en cache en utilisant Redis dans les applications Django

L'un des moyens de soulager le serveur est de mettre en cache les données. Ceci est fait en mettant en cache les données après leur traitement, puis en les servant à partir du cache lors de la prochaine demande. Ce tutoriel donnera une discussion détaillée de Redis, expliquant comment installer Redis et mettre en cache les données dans les applications Python..

Introduction à Redis et à la mise en cache

La mise en cache fait référence au stockage de la réponse du serveur dans le client lui-même, de sorte qu'un client n'a pas besoin de faire une demande de serveur pour la même ressource encore et encore. Une réponse du serveur doit contenir des informations sur la manière dont la mise en cache doit être effectuée, de sorte qu'un client mette la réponse en cache pendant une période donnée ou ne mette jamais en cache la réponse du serveur..

Un cache, en revanche, est un composant matériel ou logiciel utilisé pour stocker des données afin que les demandes futures pour les mêmes données puissent être traitées plus rapidement..

À cette époque où les utilisateurs attendent des résultats en une seconde, il est judicieux de répondre aux demandes en lisant les données à partir de la mémoire cache, ce qui est finalement plus rapide que de lire dans un magasin de données plus lent. ainsi, les performances du système dépendent du nombre de demandes pouvant être traitées à partir du cache..

Redis est un magasin de structures de données en mémoire open-source, utilisé comme base de données, cache et courtier de messages. Cela fonctionne en stockant les données dans un cache et en les fournissant à la prochaine demande, au lieu d'interroger la base de données à chaque fois..

Installer Redis

La première étape consiste à faire en sorte que Redis soit opérationnel sur votre ordinateur. Le moyen le plus simple d'installer Redis est d'utiliser le gestionnaire de paquets du système d'exploitation, comme suit:

sudo apt-get install redis-server

Vous pouvez également suivre les instructions du site officiel de Redis..

Téléchargez et extrayez le fichier tar Redis 4.0.6 comme suit:

$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz $ tar xzf redis-4.0.6.tar.gz $ cd redis-4.0.6 $ marque

Les fichiers binaires maintenant compilés sont disponibles dans le répertoire src. Exécuter Redis avec:

$ src / redis-server

Vous pouvez interagir avec Redis à l'aide du client intégré:

$ src / redis-cli redis définit foo bar OK redis get foo "bar"

Pour vérifier si le serveur Redis est en cours d'exécution, exécutez la commande suivante sur le terminal:

$ sudo redis-server * Prêt à accepter les connexions 

Exemple d'API Django

Créons notre projet Django. Notre projet pourra mettre en cache tous les produits dans un magasin, ce qui permettra de récupérer facilement et rapidement les données dans les requêtes suivantes..

Pour utiliser Redis dans notre application, nous devons procéder comme suit:

  1. Vérifier si les résultats de la requête en cours existent dans le cache.
  2. Si des résultats existent dans le cache, récupérez-les.
  3. Si les résultats n'existent pas, récupérez-les, stockez-les dans le cache, puis transmettez-les à l'entité demandeuse..

Exigences

  • Django
  • django-redis
  • Redis
  • test de chargement

Créez votre projet

Avant de commencer, créez un répertoire et installez un environnement virtuel. Un environnement virtuel vous permettra d'installer les versions de bibliothèque requises par votre application..

mkdir myprojects cd myprojects

Ensuite, activez l'environnement virtuel et installez les exigences du projet.

 source venv / bin / active installer le programme installer django == 1.9 installer le programme django-redis installer le programme djangorestframework

Créer un projet Django

django-admin startproject django_cache

Créer une nouvelle application appelée store, qui gérera la gestion des produits dans notre magasin..

cd django_cache python manage.py startapp store

Ajoutez l’application de magasin et rest_framework à la liste des applications installées dans la settings.py fichier.

# settings.py INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django. contrib.staticfiles ',' store ', # ajouter ici' rest_framework ', # ajouter ici aussi]

Créer les modèles

Dans store / models.py, nous commençons par créer le modèle de produit pour stocker les détails du produit comme suit:

from __future__ import unicode_literals from django.db import models importer datetime # Créez vos modèles ici. Classe Produit (models.Model): name = modèles.CharField (longueur maximale = 255) description = models.TextField (null = True, vide = True) price = models.IntegerField (null = True, vide = True) date_created = modèles. DateTimeField (auto_now_add = True, vide = True) date_modifié = modèles.DateTimeField (auto_now = True, vide = True) def __unicode __ (self): retourne self.name def to_json (self): retourne 'id': self.id, 'name': self.name, 'desc': self.description, 'price': self.price, 'date_created': self.date_created, 'date_modified': self.date_modified 

Migrations

Créer une migration initiale pour notre modèle de produits et synchroniser la base de données pour la première fois.

python manage.py makemigration magasin python manage.py migrer

Créer un superutilisateur

Créez un superutilisateur, connectez-vous au panneau d'administration et remplissez votre base de données avec des exemples de données que nous utiliserons pour effectuer nos tests..

python manage.py crée un utilisateur supérieur

Configuration de Redis dans les applications Python

Pour utiliser Redis avec une application Django, nous devons configurer Redis pour stocker les données de cache de l'application. Et ce qui suit à votre settings.py fichier:

CACHES = 'default': 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis: //127.0.0.1: 6379 /', 'OPTIONS': 'CLIENT_CLASS': 'django_redis.client .DefaultClient ',

Ensuite, nous allons créer un noeud final qui récupère tous les produits de notre base de données. Nous allons d’abord tester les performances de l’application en termes de temps nécessaire pour extraire les données de la base de données sans les mettre en cache. Nous allons ensuite implémenter un autre point de terminaison qui extrait les données d’un cache et compare les performances..

Dans store / views.py, ajouter le code suivant qui récupère tous les produits présents dans la base de données.

from django.shortcuts importer le rendu de rest_framework.decorators importer api_view de rest_framework.response importer réponse du statut d'importation rest_framework # Créez vos vues ici. @api_view (['GET']) def view_books (demande): products = Product.objects.all () results = [product.to_json () pour le produit dans les produits] return Response (résultats, status = status.HTTP_201_CREATED)

Configuration des URL

Créer un fichier store / urls.py et ajoutez le code suivant.

# store / urls.py de django.conf.urls import url de .views import view_books urlpatterns = [url (r '^ $', view_books),]

Nous devons également importer les URL de l’application des utilisateurs vers le répertoire principal. django_cache / urls.py fichier.

# django_cache / urls.py de l'URL d'importation django.conf.urls, inclure de l'URL django.contrib import admin urlpatterns = [url (r '^ admin /', admin.site.urls), url (r '^ store /', include ('store.urls'))] 

Faisons un test et voyons si nous sommes sur la bonne voie. Nous allons utiliser loadtest. Si vous n'êtes pas familier avec loadtest, c'est un outil de test de performance..

Installer loadtest en tant que root est simple:

sudo npm install -g loadtest
$ loadtest -n 100 -k http: // localhost: 8000 / store / # result INFO Requêtes par seconde: 55 

Comme indiqué ci-dessus, 55 demandes sont traitées par seconde.

Créons un autre noeud final pour récupérer les données après la mise en cache avec Redis. modifier utilisateurs / views.py pour correspondre à ce qui suit:

from rest_framework.decorators importer api_view depuis le statut d'importation rest_framework depuis rest_framework.response import Réponse du cache d'importation django.core.cache depuis django.conf paramètres d'importation depuis django.core.cache.backends.base import DEFAULT_TIMEOUT CACHE_TTL = get ( ', DEFAULT_TIMEOUT) from .models import # produit Créez vos vues ici. @api_view (['GET']) def view_books (demande): # reste du code @api_view (['GET']) def view_cached_books (demande): si 'produit' dans le cache: # obtient les résultats du cache products = cache .get ('product') return Response (products, status = status.HTTP_201_CREATED) else: products = Product.objects.all () results = [product.to_json () pour le produit dans les produits] # ​​stocker des données dans le cache cache.set (produit, résultats, délai d'attente = CACHE_TTL) réponse (résultats, status = status.HTTP_201_CREATED) 

Le code ci-dessus vérifie si le produit clé est présent dans le cache et, le cas échéant, les données représentées seront renvoyées au navigateur. Dans le cas où aucune donnée n'est présente dans le cache, nous récupérons d'abord les données de la base de données, nous les stockons dans le cache, puis nous renvoyons les données interrogées au navigateur..

Mettre à jour store / urls.py comme suit.

depuis django.conf.urls import url depuis .views import view_books, view_cached_books urlpatterns = [url (r '^ $', view_books), url (r '^ cache /', view_cached_books),] 

Faisons les tests.

$ loadtest -n 100 -k http: // localhost: 8000 / store / cache / # results INFO Nombre de requêtes par seconde: 233 

La première fois que vous atteignez le point de terminaison localhost: 8000 / store / cache, l'application interroge la base de données et renvoie les données, mais les appels ultérieurs à l'URL contournent la base de données et la requête du cache, car les données sont déjà disponibles dans le cache..

Conclusion

Dans ce tutoriel, nous avons utilisé Redis pour donner à une application l’illusion de rapidité. Nous exploitons l'utilisation de la mémoire RAM dans Redis pour stocker les résultats des requêtes, puis les renvoyons du cache dans les requêtes suivantes plutôt que de faire l'aller-retour vers la base de données..

Il existe d'autres outils de mise en cache, tels que Memcached, qui est similaire à Redis. Cependant, Redis est plus populaire que Memcached car il ne faut que quelques minutes pour le configurer et le rendre opérationnel. Redis a des mécanismes plus sophistiqués, comme il a été décrit comme un "magasin de structure de données", le rendant ainsi plus puissant et plus flexible. Redis a également un avantage plus important, car vous pouvez stocker des données sous n’importe quelle forme..

J'espère que ce didacticiel vous a montré à quel point il est facile d'ajouter une couche de mise en cache à votre application, ce qui améliore les performances. La mise en cache doit être un élément à prendre en compte lorsque vous devez réduire les temps de chargement et les coûts du serveur..