Naar de inhoud
Recognized by Laravel Match je project Contact

Gebruik caching effectief

Voor het laatst bijgewerkt op:

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() en once() 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 met file of database.

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'],
],

Meer info

Skill

Laravel Boost Skill

Gebruik deze skill om de richtlijn rechtstreeks toe te passen met een AI-assistent.

Use this skill when a Laravel task touches this best practice. It is self-contained so it can be installed independently by Laravel Boost or another agent-skill system.

## Core Guidance

Laravel's caching layer provides several patterns beyond simple get/put operations. Using `Cache::remember()`, `Cache::flexible()`, `Cache::memo()`, `once()`, cache tags, and failover stores properly can dramatically improve application performance while avoiding common pitfalls like race conditions and stale data.

## Why It Matters

- **Reduced boilerplate**: `Cache::remember()` replaces manual get/check/put patterns with an atomic operation
- **Better user experience**: `Cache::flexible()` serves stale data while refreshing in the background, so no user takes the slow-path hit
- **Fewer round-trips**: `Cache::memo()` and `once()` eliminate redundant cache or computation calls within a single request
- **Clean invalidation**: Cache tags allow flushing related groups of entries atomically
- **Resilience**: Failover cache stores keep the application running when the primary cache goes down

## Apply When

- Applications with expensive database queries or API calls that don't need to be real-time
- High-traffic endpoints where cache stampedes are a concern
- Applications with related data that needs to be invalidated together
- Production environments where cache store reliability matters

## Be Careful When

- Data that must always be fresh (financial transactions, real-time inventory)
- Development environments where caching obscures bugs
- Simple applications with fast queries and low traffic

## Canonical Source

- Full best practice: https://github.com/Dutch-Laravel-Foundation/best-practices/blob/main/application-performance/use-caching-effectively/BEST_PRACTICE.md
- Dutch translation: https://github.com/Dutch-Laravel-Foundation/best-practices/blob/main/application-performance/use-caching-effectively/translations/nl.md

## Workflow

1. Inspect the user's Laravel code before recommending changes.
2. Identify the narrow rule from this best practice that applies to the task.
3. Prefer Laravel's built-in conventions and documented APIs over custom abstractions.
4. Keep examples focused on this practice; reference other skills or practices when the task crosses boundaries.
5. Verify code changes with the project's available tests, linters, static analysis, or framework checks.

## Review Checklist

- The recommendation is Laravel-specific and grounded in this practice.
- Code examples use realistic Laravel file names, class names, and method names.
- The advice avoids mixing unrelated architecture, deployment, security, or testing topics.
- Related practices are mentioned when useful, but not re-explained in full.
- Dutch output, when requested, keeps framework and API names intact.