Cache API

La cache permette di riutilizzare il risultato di un'operazione già eseguita invece di ripeterla a ogni richiesta. La cache è divisa in più cache bin, ad esempio default, bootstrap, render, data, discovery e memory. 

Quando un componente produce output cacheabile bisogna rispondere a quattro domande: 

  • Da quale contesto cambia? --> Cache contexts
  • Da quali dati dipende? --> Cache tags
  • Per quanto tempo rimane valido? --> Cache max-age (diverso da expire che è un timestamp assoluto)
  • Come identifico questo specifico output? --> Cache keys

Metodi principali:

  • get()
  • getMultiple()
  • set()
  • setMultiple()
  • delete() --> rimuove l'elemento dal cache backend
  • deleteMultiple()
  • invalidate() --> marca l'elemento come non valido ma può conservarlo fisicamente
  • invalidateMultiple()
  • deleteAll()
  • garbageCollection()

Cache contexts

Se ad esempio abbiamo due utenti sul sito e vogliamo mostrare un messaggio di saluto con il nome dell'utente dobbiamo specificare la dipendenza dal contesto dello user, altrimenti avrebbero tutti lo stesso nome:

'#cache' => [ 
  'contexts' => [ 
    'user', 
  ], 
]

Se l'output cambia soltanto in base alle permission, è meglio utilizzare user.permissions.

Cache tags

Cache max-age

Per impostare una durata in secondi usare un numero positivo, per impostare un dato non cacheabile usare 0, per impostare una validità infinita usare Cache::PERMANENT.

Cacheability bubbling

I metadata dei figli devono propagarsi verso i contenitori.

Internal Page Cache

E' un modulo del core destinato alle pagine degli utenti anonimi: la prima richiesta genera la pagina, una richiesta anonima compatibile successiva può ricevere direttamente la versione memorizzata (il modulo assume che le pagine servite agli utenti anonimi siano uguali fra loro).

Cache warming

E' possibile aggiornare preventivamente la cache in modo che la richiesta dell'utente non debba necessariamente aspettare la rete esterna.

Performance

Principi fondamentali:

  • Evitare lavoro non necessario
  • Cache dei dati
  • Refresh asincrono
  • Cache dell'output

@TODO fare approfondimento su problema N+1