Configurare la cache degli oggetti

In questa pagina

La cache per richiesta di EmDash già deduplica le letture identiche durante il rendering di una pagina. La cache degli oggetti opzionale mantiene i risultati delle query selezionati tra le richieste, permettendo a una richiesta successiva di evitare la stessa lettura del database. È utile quando il traffico pubblico genera più letture del database di quante il backend selezionato dovrebbe gestire.

Il database rimane la fonte di verità. Le letture dalla cache falliscono in modo aperto verso il database e le scritture invalidano il namespace di cache interessato. La cache degli oggetti è disabilitata per impostazione predefinita; abilitala aggiungendo un adattatore objectCache all’integrazione emdash().

Panoramica

BackendMigliore perCondiviso tra isolati
KVCloudflare WorkersSì
MemoryNode.js, sviluppo localeNo (per processo)

Su Cloudflare, le richieste sono servite da molti isolati effimeri in diverse regioni. KV è condiviso da tutti, quindi un valore memorizzato in cache da una richiesta è disponibile per la successiva, ovunque. Il backend in memoria memorizza all’interno di un singolo processo, adatto a un server Node.js a lunga esecuzione.

Cloudflare KV

Configura l’adattatore KV e collegalo a un binding KV:

import emdash from "emdash/astro";
import { d1, r2, kvCache } from "@emdash-cms/cloudflare";

export default defineConfig({
	integrations: [
		emdash({
			database: d1({ binding: "DB" }),
			storage: r2({ binding: "MEDIA" }),
			objectCache: kvCache({ binding: "CACHE" }),
		}),
	],
});

Configurazione

Crea un namespace KV e aggiungi il binding alla configurazione Wrangler.

npx wrangler kv namespace create CACHE

Il comando stampa l’id del namespace. Aggiungilo con il nome del binding usato in kvCache:

wrangler.jsonc

{
  "kv_namespaces": [
    {
      "binding": "CACHE",
      "id": "<namespace-id>"
    }
  ]
}

wrangler.toml

[[kv_namespaces]]
binding = "CACHE"
id = "<namespace-id>"

Opzioni

OpzioneTipoPredefinitoDescrizione
bindingstring—Nome del binding KV dalla configurazione Wrangler. Obbligatorio.
defaultTtlnumber3600Tempo di vita delle voci in cache, in secondi. KV impone un minimo di 60 secondi.
revalidatenumber1000Finestra di riutilizzo dell’epoch locale all’isolato, in millisecondi. Vedi Freschezza.
timeoutnumber2000Tempo massimo, in millisecondi, per attendere un’operazione KV prima di trattarla come cache miss. Evita che una lettura KV bloccata blocchi la richiesta. Imposta 0 per disabilitare.
keyPrefixstring"em"Prefisso per ogni chiave di cache. Imposta un valore univoco quando più siti condividono un namespace.

Node.js (memoria)

L’adattatore in memoria memorizza nella cache all’interno del processo del server. Non richiede servizi esterni:

import emdash, { memoryCache } from "emdash/astro";
import { sqlite } from "emdash/db";

export default defineConfig({
	integrations: [
		emdash({
			database: sqlite({ url: "file:./data.db" }),
			objectCache: memoryCache(),
		}),
	],
});

Opzioni

OpzioneTipoPredefinitoDescrizione
defaultTtlnumber3600Tempo di vita delle voci in cache, in secondi.
revalidatenumber1000Finestra di riutilizzo dell’epoch locale all’isolato, in ms.
maxEntriesnumber1000Numero massimo di chiavi in cache prima dell’eliminazione delle più vecchie.
keyPrefixstring"em"Prefisso per ogni chiave di cache.

Cosa viene memorizzato nella cache

La cache degli oggetti copre le letture eseguite in un tipico rendering di pagina:

  • Query di contenuto: getEmDashCollection, getEmDashEntry e resolveEmDashPath.
  • Impostazioni del sito, menu di navigazione e termini di tassonomia.

Le richieste Admin API, i file multimediali e le risposte HTML complete non sono gestite qui. Per memorizzare nella cache l’HTML renderizzato all’edge, vedi Distribuire su Cloudflare.

La cache degli oggetti e una cache HTML edge risolvono problemi diversi. Un hit nel livello HTML non esegue EmDash. Un miss avvia il Worker e una risposta che può popolare la route cache di Astro bypassa la cache degli oggetti. Le query di contenuto di quest’ultima leggono dal database, così una pagina invalidata dopo una modifica al contenuto non viene ricostruita con uno snapshot KV più vecchio.

Freschezza

La modifica del contenuto tramite il pannello di amministrazione o l’API REST invalida automaticamente le voci di cache interessate. Creare, aggiornare, pubblicare o eliminare una voce cancella le query in cache per la relativa collezione; modificare un byline o un termine di tassonomia cancella le voci che lo mostrano.

Per le richieste che non popolano la route cache, una modifica impiega del tempo per apparire su tutti gli isolati man mano che aggiornano l’epoch. Con il backend in memoria nell’isolato l’effetto è immediato. Con Workers KV è limitato dalla propagazione della edge cache di KV (consistenza eventuale, fino a ~60 secondi) più la finestra revalidate locale all’isolato (predefinito un secondo). Riduci revalidate per una propagazione locale più rapida a costo di più letture sulla cache; aumentalo per leggere la cache meno spesso.

Contenuto pianificato

Le voci pianificate diventano visibili quando scade l’orario di pubblicazione. Una pagina in cache riflette una voce pianificata appena pubblicata al prossimo cambiamento nella relativa collezione oppure quando scade il defaultTtl della voce in cache. Se per il tuo sito è importante la pubblicazione pianificata precisa, imposta un defaultTtl più basso.