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
database (par défaut)
database (par défaut)
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 :
file
file
Stocke sur le système de fichiers.
Aucune installation, convient aux petites applications.
redis
redis
Cache en mémoire très rapide, le plus utilisé en production.
Nécessite l’extension PhpRedis ou le package
predis/predis.memcached
memcached
Nécessite l’extension PECL Memcached.
Configurez les serveurs dans
config/cache.php.dynamodb
dynamodb
Utilise AWS DynamoDB comme cache.
Créez la table au préalable et installez l’AWS SDK.
storage
storage
Utilise un disque filesystem comme store clé/valeur.
Utile pour réutiliser un disque S3 existant.
array / null (tests)
array / null (tests)
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çadeCache.
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).
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.
Flux de remember()
Version permanente : rememberForever().
rememberWithWarmth().
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()
flushLocks().
Prolonger le TTL : Cache::touch()
Mémoïsation du cache
Le drivermemo 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.Structure
Une entrée peut porter plusieurs tags ; supprimer un tag purge toutes les entrées associées.Écriture / lecture
Suppression par tag
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
Attente
Attend jusqu’à N secondes ; sinon lèveLockTimeoutException.
Prévenir l’exécution simultanée : withoutOverlapping()
Limiter la concurrence : funnel()
Passer un verrou entre processus
Renouvellement du verrou
Prolongez un verrou en cours avecrefresh (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
Méthodes fréquentes
Méthodes fréquentes
Choix du driver
Choix du driver
- Dev / petit projet :
fileoudatabase - Prod à fort trafic :
redis(avec Laravel Horizon pour la supervision) - AWS :
dynamodboustorage(via S3) - Tests :
arrayounull
Bonnes pratiques
Bonnes pratiques
- Clés uniques dans toute l’app (ex :
users:1:profile) - Invalidez avec
Cache::forget()ouCache::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