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 inconfig/cache.php.
Met de omgevingsvariabele CACHE_STORE schakel je tussen standaarddrivers.
Beschikbare drivers
database (standaard)
database (standaard)
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.
file
file
Slaat cachedata op in het bestandssysteem.
Geen extra setup nodig, geschikt voor kleine applicaties.
redis
redis
Een snelle cachedriver die in-memory werkt.
Wordt in productieomgevingen het meest gebruikt. Vereist de PhpRedis PHP-extensie of het pakket
predis/predis.memcached
memcached
Vereist het Memcached PECL-pakket.
Configureer de servers in
config/cache.php.dynamodb
dynamodb
Gebruikt AWS DynamoDB als cache store.
Maak vooraf een DynamoDB-tabel aan en installeer de AWS SDK.
storage
storage
Gebruikt een willekeurige filesystem-disk als key/value-cachestore.
Handig als je een bestaande S3-disk direct als cache wilt gebruiken.
array / null (voor testen)
array / null (voor testen)
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 deCache-facade om met de cache te werken.
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.
add() die alleen opslaat als de cache nog niet bestaat.
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.
De flow van remember()
Er is ook een permanente variant:rememberForever().
rememberWithWarmth(). Deze methode geeft een array terug met de cachewaarde en een boolean die aangeeft of de waarde warm was (uit de cache kwam).
Stale While Revalidate (flexibele cachevernieuwing)
BijCache::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::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 dememo-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.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
Atomische bewerkingen (locks)
MetCache::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
Wachten op een lock
Wacht maximaal het opgegeven aantal seconden totdat de lock verkregen kan worden. Bij een time-out wordt eenLockTimeoutException gegooid.
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.forceRelease.
Een lock verversen
Om de geldigheidsduur van een lock die je momenteel vasthoudt te verlengen, gebruik je de methoderefresh. 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 helperfunctiecache() 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
Overzicht van veelgebruikte methoden
Overzicht van veelgebruikte methoden
Een driver kiezen
Een driver kiezen
- Ontwikkeling en kleinschalig:
fileofdatabase - Productie en veel verkeer:
redis(in combinatie met Laravel Horizon ook eenvoudig te monitoren) - AWS-omgeving:
dynamodbofstorage(bij hergebruik van een S3-disk) - Testen:
arrayofnull
Best practices voor caching
Best practices voor caching
- Geef cachekeys namen die uniek zijn binnen de hele app (bijv.
users:1:profile) - Invalideer de cache met
Cache::forget()ofCache::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