Skip to main content

Qu’est-ce que le cache

Une requête à la base ou un appel API externe est coûteux en CPU et en réseau, et peut prendre plusieurs secondes. Si les mêmes données sont récupérées à plusieurs reprises, mettre le résultat en cache accélère toutes les requêtes suivantes. Laravel propose une API unifiée pour Memcached, Redis, DynamoDB, base de données et bien d’autres backends.
Le driver par défaut est database. Passer à Redis ou Memcached permet un cache encore plus rapide.

Configuration

config/cache.php

La configuration se trouve dans config/cache.php. CACHE_STORE change le driver par défaut.

Drivers disponibles

Stocke les données de cache sérialisées dans une table. Sous Laravel 11+, les migrations sont incluses par défaut.
Sinon, générez la table :
Stocke sur le système de fichiers. Aucune installation, convient aux petites applications.
Cache en mémoire très rapide, le plus utilisé en production. Nécessite l’extension PhpRedis ou le package predis/predis.
Nécessite l’extension PECL Memcached. Configurez les serveurs dans config/cache.php.
Utilise AWS DynamoDB comme cache. Créez la table au préalable et installez l’AWS SDK.
Utilise un disque filesystem comme store clé/valeur. Utile pour réutiliser un disque S3 existant.
array : mémoire limitée à la requête. null : ignore les opérations. Utile pour les tests automatisés.

Hiérarchie des drivers de cache

Utilisez chaque driver selon l’usage et la vitesse.

Opérations de base

Façade Cache

Manipulez le cache via la façade Cache.
Utilisez store() pour cibler un store spécifique.

Récupération : Cache::get()

get() retourne la valeur, ou null par défaut.

Écriture : Cache::put()

put() stocke une valeur ; TTL en secondes en 3ᵉ argument.
add() n’écrit que si la clé n’existe pas encore (atomique).
Pour un stockage permanent : forever().

Get-or-set : Cache::remember()

L’opération la plus utilisée. Retourne la valeur en cache si présente, sinon exécute la closure et met en cache le résultat.
Cache::remember() remplace le trio « vérifier / récupérer / mettre en cache » par une seule ligne. Idéal pour les résultats de DB ou d’API externes.

Flux de remember()

Version permanente : rememberForever().
Pour savoir si la valeur vient du cache, utilisez rememberWithWarmth().
Utile pour surveiller l’efficacité du cache. Si $warm est souvent false, ajustez le TTL.

Stale While Revalidate

Cache::flexible() définit une période « frais » et une période « stale mais utilisable ». On sert du contenu obsolète tout en actualisant le cache en arrière-plan.

Existence : Cache::has()

Incrément / Décrément

Manipule des compteurs entiers.

Get-and-delete : Cache::pull()

Récupère et supprime en une opération.

Suppression : Cache::forget()

Cache::flush() supprime toutes les entrées, en ignorant le préfixe. Attention en environnement partagé.
Videz tous les verrous atomiques avec flushLocks().

Prolonger le TTL : Cache::touch()

Mémoïsation du cache

Le driver memo met en cache en mémoire les accès pendant une même requête, réduisant les allers-retours vers le store.

Tags de cache

Groupez des entrées par tag pour les supprimer en masse.
Non pris en charge par file, dynamodb, database, storage. Nécessite redis ou memcached.

Structure

Une entrée peut porter plusieurs tags ; supprimer un tag purge toutes les entrées associées.

Écriture / lecture

Suppression par tag

Idéal pour invalider par groupe : Cache::tags(['user', "user:{$userId}"])->flush() purge tout ce qui concerne un utilisateur.

Opérations atomiques (verrous)

Cache::lock() implémente des verrous distribués et prévient les conditions de course.
Disponible sur memcached, redis, dynamodb, database, file, array. Tous les serveurs doivent parler au même cache central.

Verrou de base

Avec closure, la libération est automatique.

Attente

Attend jusqu’à N secondes ; sinon lève LockTimeoutException.
Version concise :

Prévenir l’exécution simultanée : withoutOverlapping()

Limiter la concurrence : funnel()

Passer un verrou entre processus

Libération forcée quel que soit le propriétaire :

Renouvellement du verrou

Prolongez un verrou en cours avec refresh (sans argument, réutilise le TTL initial). Idéal pour un traitement long sans avoir à fixer un TTL énorme au départ.

Helper cache()

Le helper cache() équivaut à la façade Cache.

Exemples pratiques

Cache d’une requête DB

1

Mise en cache dans le contrôleur

2

Invalidation lors d'un update

Cache d’un modèle Eloquent

Cache d’une réponse d’API

Gestion par tag

Récapitulatif

  • Dev / petit projet : file ou database
  • Prod à fort trafic : redis (avec Laravel Horizon pour la supervision)
  • AWS : dynamodb ou storage (via S3)
  • Tests : array ou null
  • Clés uniques dans toute l’app (ex : users:1:profile)
  • Invalidez avec Cache::forget() ou Cache::tags()->flush() après mise à jour
  • Ni trop court ni trop long : TTL adapté à la fréquence de mise à jour
  • Cache::remember() simplifie le pattern get-or-set
  • En production, préférez Redis, avec un failover réfléchi
Dernière modification le 13 juillet 2026