Optimisation des performances Django via les mécanismes de mise en cache

La mise en cache est une technique essentielle pour réduire la latence des applications web. En stockant le résultat de calculs coûteux ou de requêtes complexes en mémoiree, Django permet de servir les requêtes ultérieures quasi instantanément, améliorant ainsi l'expérience utilisateur et soulageant la base de données.

Principe de fonctionnement

Le flux logique d'un système de cache suit généralement ces étapes :

  1. Le client envoie une requête vers une URL spécifique.
  2. Le serveur intercepte la requête et vérifie si une réponse correspondante existe déjà dans le cache.
  3. Cache Hit : Si la donnée est présente, elle est renvoyée immédiatement sans traitement supplémentaire.
  4. Cache Miss : Si la donnée est absente, la vue exécute la logique métier (accès à la base de données, calculs).
  5. Le serveur stocke le résultat dans le cache pour une durée déterminée (TTL) avant de renvoyer la réponse au client.

Configuration des backends de stockage

Django supporte plusieurs types de stockage pour le cache via le dictionnaire CACHES dans le fichier settings.py.

1. Cache en base de données

Utile si vous ne disposez pas d'un serveur de cache dédié. Il faut d'abord créer la table de cache :

python manage.py createcachetable ma_table_cache

Configuration :

CACHES = {
   'default': {
       'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
       'LOCATION': 'ma_table_cache',
       'TIMEOUT': 300,  # 5 minutes
   }
}

2. Cache avec Redis

Redis est l'une des solutions les plus performantes. Elle nécessite l'installation du paquet django-redis.

CACHES = {
   'redis_backend': {
       'BACKEND': 'django_redis.cache.RedisCache',
       'LOCATION': 'redis://127.0.0.1:6379/1',
       'OPTIONS': {
           'CLIENT_CLASS': 'django_redis.client.DefaultClient',
       }
   }
}

3. Cache avec Memcached

Memcached est un service de cache distribué très populaire. Pour l'utiliser avec Python, installez python-memcached ou pylibmc.

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

4. Cache sur système de fichiers

Stocke les données sérialisées sous forme de fichiers individuels.

CACHES = {
   'default': {
       'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
       'LOCATION': '/var/tmp/django_cache',
   }
}

Utilisation dans le code

Il existe deux approches principales pour implémenter le cache au niveau applicatif.

A. Utilisation des décorateurs de vue

Le décorateur cache_page permet de mettre en cache l'intégralité du rendu d'une vue pour une durée précise.

from django.views.decorators.cache import cache_page
from django.http import HttpResponse
import time

@cache_page(120, cache='redis_backend', key_prefix='catalogue')
def liste_produits(request):
   # Simulation d'un traitement lourd
   time.sleep(2)
   return HttpResponse("Affichage de la liste des produits")

B. API de bas niveau (Low-level Cache API)

Pour un contrôle plus granulaire sur les données spécfiiques à mettre en cache.

from django.core.cache import caches
from django.shortcuts import render

def vue_actualites(request):
   # Sélection du backend spécifique
   cache_system = caches['redis_backend']
   cle_cache = "dernieres_news"
   
   contenu = cache_system.get(cle_cache)
   
   if contenu is None:
       # Si le cache est vide, on génère les données
       items = []
       for i in range(5):
           items.append(f"Actualité système numéro {i}")
       
       # Simulation d'un délai réseau ou DB
       import time
       time.sleep(3)
       
       reponse = render(request, 'news.html', {'news': items})
       # Sauvegarde du contenu HTML de la réponse
       cache_system.set(cle_cache, reponse.content, timeout=3600)
       return reponse

   return HttpResponse(contenu)

Étiquettes: Django Redis Memcached performance Python

Publié le 12 octobre à 11h13