Introductie
De cachinglaag van Laravel biedt meerdere patronen die verder gaan dan eenvoudige get/put-operaties. Het correct gebruiken van Cache::remember(), Cache::flexible(), Cache::memo(), once(), cache tags en failover stores kan de prestaties van je applicatie drastisch verbeteren, terwijl je veelvoorkomende valkuilen zoals race conditions en verouderde data vermijdt.
Waarom
- Minder boilerplate:
Cache::remember()vervangt handmatige get/check/put-patronen door één atomaire operatie - Betere gebruikerservaring:
Cache::flexible()serveert verouderde data terwijl deze op de achtergrond wordt ververst, zodat geen enkele gebruiker de trage route hoeft te nemen - Minder round-trips:
Cache::memo()enonce()elimineren overbodige cache- of berekeningsaanroepen binnen één request - Schone invalidatie: Cache tags maken het mogelijk om gerelateerde groepen entries atomair te legen
- Veerkracht: Failover cache stores houden de applicatie draaiende wanneer de primaire cache uitvalt
Geschikt voor
- Applicaties met kostbare database queries of API calls die niet realtime hoeven te zijn
- Endpoints met veel verkeer waar cache stampedes een zorg zijn
- Applicaties met gerelateerde data die samen geïnvalideerd moet worden
- Productieomgevingen waar de betrouwbaarheid van de cache store van belang is
Minder geschikt voor
- Data die altijd actueel moet zijn (financiële transacties, realtime voorraad)
- Ontwikkelomgevingen waar caching bugs verhult
- Eenvoudige applicaties met snelle queries en weinig verkeer
Voorbeelden
Gebruik Cache::remember() in plaats van handmatige get/put
// Slecht: race condition, boilerplate
$val = Cache::get('stats');
if (! $val) {
$val = $this->computeStats();
Cache::put('stats', $val, 60);
}
// Goed: atomair patroon
$val = Cache::remember('stats', 60, fn () => $this->computeStats());
Gebruik Cache::flexible() voor stale-while-revalidate
Bij keys met veel verkeer krijgt er altijd één gebruiker een traag antwoord wanneer de cache verloopt. flexible() serveert licht verouderde data terwijl deze op de achtergrond wordt ververst:
// Slecht: één ongelukkige gebruiker wacht op de herberekening
Cache::remember('users', 300, fn () => User::all());
// Goed: vers gedurende 5 min, verouderd-maar-geserveerd tot 10 min, ververst via deferred functie
Cache::flexible('users', [300, 600], fn () => User::all());
Gebruik Cache::memo() om overbodige hits te vermijden
Als dezelfde cache key meerdere keren per request wordt gelezen, slaat memo() de opgeloste waarde in het geheugen op:
Cache::memo()->get('settings'); // 5 aanroepen = 1 Redis round-trip in plaats van 5
Gebruik cache tags om gerelateerde groepen te invalideren
Cache::tags(['user-1'])->flush();
Let op: Tags werken alleen met
redis,memcached,dynamodb, niet metfileofdatabase.
Gebruik once() voor memoization per request
once() memoiseert de retourwaarde van een functie voor de levensduur van het object, puur in-memory, zonder de cache store aan te spreken:
public function roles(): Collection
{
return once(fn () => $this->loadRoles());
}
Gebruik Cache::add() voor atomaire conditionele writes
// Slecht: race condition tussen check en write
if (! Cache::has('lock')) {
Cache::put('lock', true, 10);
}
// Goed: atomair, schrijft alleen als de key nog niet bestaat
Cache::add('lock', true, 10);
Configureer failover cache stores in productie
// config/cache.php
'failover' => [
'driver' => 'failover',
'stores' => ['redis', 'database'],
],