Skip to main content

Wat is caching?

Databasequery’s en aanroepen naar externe API’s zijn duur qua CPU en netwerk en kunnen meerdere seconden duren. Als je dezelfde data vaker ophaalt, kun je het resultaat in de cache opslaan zodat volgende requests snel verwerkt worden. Laravel biedt een uniforme API die diverse cache-backends ondersteunt, zoals Memcached, Redis, DynamoDB en de database.
Standaard is de database-driver geconfigureerd. Door over te schakelen naar Redis of Memcached krijg je een nog snellere cache.

Cacheconfiguratie

config/cache.php

De cacheconfiguratie staat gebundeld in config/cache.php. Met de omgevingsvariabele CACHE_STORE schakel je tussen standaarddrivers.

Beschikbare drivers

Slaat geserialiseerde cachedata op in een databasetabel. Nieuwe projecten vanaf Laravel 11 bevatten de migration standaard.
Als de migration ontbreekt, maak je hem aan met een Artisan-commando.
Slaat cachedata op in het bestandssysteem. Geen extra setup nodig, geschikt voor kleine applicaties.
Een snelle cachedriver die in-memory werkt. Wordt in productieomgevingen het meest gebruikt. Vereist de PhpRedis PHP-extensie of het pakket predis/predis.
Vereist het Memcached PECL-pakket. Configureer de servers in config/cache.php.
Gebruikt AWS DynamoDB als cache store. Maak vooraf een DynamoDB-tabel aan en installeer de AWS SDK.
Gebruikt een willekeurige filesystem-disk als key/value-cachestore. Handig als je een bestaande S3-disk direct als cache wilt gebruiken.
array is een in-memory cache die alleen binnen de request geldig is. null negeert alle bewerkingen. Beide zijn handig bij geautomatiseerde tests.

Hiërarchie van cachedrivers

Kies de driver op basis van toepassing en snelheid.

Basisbewerkingen

De Cache-facade gebruiken

Gebruik de Cache-facade om met de cache te werken.
Om meerdere cache stores te gebruiken, gebruik je de methode store().

Data ophalen: Cache::get()

Met de methode get() haal je data uit de cache. Als de cache niet bestaat, wordt null teruggegeven. Je kunt ook een standaardwaarde opgeven.

Data opslaan: Cache::put()

Met de methode put() sla je data op in de cache. Als derde argument geef je de geldigheidsduur (in seconden) op.
Er is ook een methode add() die alleen opslaat als de cache nog niet bestaat.
Om permanent op te slaan gebruik je forever().

Ophalen of opslaan: Cache::remember()

Dit is de meest gebruikte bewerking. Als de data in de cache staat, wordt die teruggegeven; zo niet, dan wordt de closure uitgevoerd en het resultaat opgeslagen.
Met Cache::remember() schrijf je de drie stappen “cache controleren → ophalen als hij ontbreekt → opslaan in de cache” in één regel. Ideaal voor het cachen van databasequeryresultaten en responses van externe API’s.

De flow van remember()

Er is ook een permanente variant: rememberForever().
Wil je weten of de cache een “hit” was of dat de waarde nieuw is opgehaald via de closure, gebruik dan de methode rememberWithWarmth(). Deze methode geeft een array terug met de cachewaarde en een boolean die aangeeft of de waarde warm was (uit de cache kwam).
rememberWithWarmth() is handig als je de effectiviteit van je cache wilt monitoren. Is $warm vaak false, dan kun je dat mogelijk verbeteren door de geldigheidsduur (TTL) van de cache aan te passen.

Stale While Revalidate (flexibele cachevernieuwing)

Bij Cache::flexible() geef je met een array een “verse periode” en een “periode waarin verouderde data nog bruikbaar is” op. Dit is het patroon waarbij je verouderde data aan de gebruiker teruggeeft terwijl de cache op de achtergrond wordt vernieuwd.

Bestaan controleren: Cache::has()

Waarden verhogen / verlagen

Je kunt integer-tellers bijwerken.

Ophalen en verwijderen: Cache::pull()

Haalt de waarde op en verwijdert hem daarna uit de cache. Handig voor het beheren van eenmalige data.

Data verwijderen: Cache::forget()

Cache::flush() verwijdert alle entries, ongeacht de “prefix”-instelling van de cache. Wees voorzichtig als de cache door meerdere applicaties wordt gedeeld.
Met Cache::flushLocks() kun je alle atomische locks in de cache wissen.

TTL verlengen: Cache::touch()

Verlengt de geldigheidsduur van een bestaand cache-item.

Cache-memoization

Met de memo-driver worden cachetoegangen binnen dezelfde request in het geheugen gecachet. Bij veel herhaalde toegang tot dezelfde key vermindert dit het aantal roundtrips naar de cache store.

Cachetags

Je kunt gerelateerde cache-items groeperen met tags en ze in één keer verwijderen.
Cachetags zijn niet beschikbaar met de drivers file, dynamodb, database en storage. Je hebt de redis- of memcached-driver nodig.

Structuur van getagde cache

Cache-items met meerdere tags kun je via elk van die tags gebundeld verwijderen.

Getagde cache opslaan en ophalen

Getagde cache verwijderen

Tags zijn handig wanneer je de cache per groep wilt invalideren, bijvoorbeeld per gebruiker of per artikel. Voorbeeld: met Cache::tags(['user', "user:{$userId}"])->flush() wis je alle cache van die gebruiker.

Atomische bewerkingen (locks)

Met Cache::lock() kun je gedistribueerde locks implementeren en race conditions door meerdere processen of parallelle requests voorkomen.
Deze functionaliteit is beschikbaar met de cachedrivers memcached, redis, dynamodb, database, file en array. Alle servers moeten met dezelfde centrale cacheserver communiceren.

Basislocks

Geef je een closure door, dan wordt de lock na afloop automatisch vrijgegeven.

Wachten op een lock

Wacht maximaal het opgegeven aantal seconden totdat de lock verkregen kan worden. Bij een time-out wordt een LockTimeoutException gegooid.
Met een closure schrijf je het eenvoudiger.

Dubbele uitvoering voorkomen: withoutOverlapping()

Een eenvoudige manier om te voorkomen dat dezelfde taak meerdere keren tegelijk draait.

Aantal gelijktijdige uitvoeringen beperken: funnel()

Beperkt het aantal taken dat gelijktijdig mag draaien.

Locks doorgeven tussen processen

Een voorbeeld waarbij je een lock verkrijgt in een webrequest en vrijgeeft in een queue-job.
Om een lock geforceerd vrij te geven ongeacht de huidige eigenaar, gebruik je de methode forceRelease.

Een lock verversen

Om de geldigheidsduur van een lock die je momenteel vasthoudt te verlengen, gebruik je de methode refresh. Geef je geen aantal seconden op, dan wordt de oorspronkelijke geldigheidsduur van het verkrijgen gebruikt. Handig bij langdurige taken waarbij je een korte lock periodiek wilt verlengen, zodat je niet vanaf het begin een extreem lange geldigheidsduur hoeft in te stellen.

De cachehelper

Met de helperfunctie cache() schrijf je dezelfde bewerkingen als met de Cache-facade eenvoudiger.

Praktijkvoorbeelden

Databasequeryresultaten cachen

1

Cache het queryresultaat in de controller

2

Verwijder de cache wanneer de data wordt bijgewerkt

Eloquent-modellen cachen

API-responses cachen

Groepsbeheer met cachetags

Samenvatting

  • Ontwikkeling en kleinschalig: file of database
  • Productie en veel verkeer: redis (in combinatie met Laravel Horizon ook eenvoudig te monitoren)
  • AWS-omgeving: dynamodb of storage (bij hergebruik van een S3-disk)
  • Testen: array of null
  • Geef cachekeys namen die uniek zijn binnen de hele app (bijv. users:1:profile)
  • Invalideer de cache met Cache::forget() of Cache::tags()->flush() wanneer de data wordt bijgewerkt
  • Stel de TTL van de cache niet te kort en niet te lang in, afgestemd op hoe vaak de data verandert
  • Met Cache::remember() schrijf je de afhandeling van een cache-miss beknopt
  • Gebruik in productie Redis en overweeg ook een failover-configuratie
Laatst gewijzigd op 6 september 2026