notiziephp.it

Memoizza le letture della cache con tag in Laravel

Traduzione da Laravel News
28 Settembre 2026 Tempo di lettura: 3 minuti
Memoizza le letture della cache con tag in Laravel

La cache memoizzata di Laravel, Cache::memo(), legge una chiave dal tuo cache store una volta e la serve dalla memoria per il resto della richiesta o del job. A partire da Laravel 13.33, funziona anche con i tag della cache, quindi puoi memoizzare valori con tag con Cache::memo()->tags().

Questo aiuta quando una richiesta legge lo stesso valore con tag molte volte. Una ricerca dei permessi potrebbe essere eseguita per ogni chiamata a can() e per ogni direttiva @can in una view, e senza memoizzazione ognuna ritorna al cache store.

Memoizzare una ricerca con tag

Chiama tags() sulla cache memoizzata e usala come qualsiasi altra cache con tag:

use Illuminate\Support\Facades\Cache;

public function getPermissions(User $user): Collection
{
return Cache::memo()
->tags(['permissions', "user:{$user->id}"])
->remember(
"permissions:{$user->id}",
now()->addHour(),
fn () => $this->loadPermissionsFromDatabase($user)
);
}

La prima chiamata in una richiesta legge dal cache store, oppure esegue la closure in caso di cache miss. Le chiamate successive con gli stessi tag e la stessa chiave restituiscono il valore dalla memoria.

Prima che la cache memoizzata supportasse i tag, la soluzione alternativa era avvolgere tu stesso la cache con tag in uno store array:

return Cache::store('array')->tags('permission_cache')->rememberForever($cacheKey,
fn () => Cache::tags($this->cacheTags($user))->remember(
$cacheKey,
config('auth.permissions.default_cache_time'),
fn () => $this->loadPermissionsFromDatabase($user)
)
);

Scritture e flush

I metodi che modificano un valore scrivono nella cache con tag e eliminano la copia memoizzata di quella chiave, quindi la lettura successiva torna allo store:

$cache = Cache::memo()->tags(['permissions']);

$cache->get('permissions:1');           // Reads from the cache store
$cache->get('permissions:1');           // Reads from memory

$cache->put('permissions:1', $updated); // Writes to the store, forgets the memoized value
$cache->get('permissions:1');           // Reads from the cache store again

Questo copre put(), putMany(), add(), increment(), decrement(), forever(), touch(), e forget(). Chiamare flush() su una cache con tag memoizzata esegue il flush dei tag nello store e cancella i valori con tag memoizzati.

Quando usarla

La cache memoizzata conserva ciò che la richiesta corrente ha già letto. Se un worker di coda o un'altra richiesta modifica il valore, questa richiesta non vede la modifica.

La userei per valori che non cambiano durante una richiesta, come permessi o impostazioni. Mantieni i contatori e qualsiasi cosa che un altro processo aggiorna a metà richiesta sulla cache normale.

I valori memoizzati si azzerano all'inizio di ogni richiesta o job, quindi i worker di lunga durata non mantengono dati obsoleti tra un job e l'altro.

Per approfondire

Condividi su: LinkedIn

Altri articoli recenti