Objekt-Cache

Auf dieser Seite

EmDash liest Inhalte und Seitenkonfiguration bei jeder Anfrage aus der Datenbank. Der Objekt-Cache speichert diese Abfrageergebnisse in einem schnellen Key/Value-Speicher, sodass wiederholte Anfragen aus dem Cache statt aus der Datenbank bedient werden. Er reduziert die Leselast auf die Datenbank — nützlich auf Cloudflare, wo KV weit mehr Anfragen pro Sekunde bedient als D1.

Der Objekt-Cache ist optional und standardmäßig deaktiviert. Aktivieren Sie ihn, indem Sie einen objectCache-Adapter zur emdash()-Integration hinzufügen.

Überblick

BackendIdeal fürÜber Isolates hinweg geteilt
KVCloudflare WorkersJa
MemoryNode.js, lokale EntwicklungNein (pro Prozess)

Auf Cloudflare werden Anfragen von vielen kurzlebigen Isolates in verschiedenen Regionen bedient. KV wird von allen geteilt, sodass ein Wert, der von einer Anfrage gecacht wurde, für die nächste verfügbar ist — überall. Das Memory-Backend cached innerhalb eines einzelnen Prozesses, was für einen langlebigen Node.js-Server geeignet ist.

Cloudflare KV

Konfigurieren Sie den KV-Adapter und verweisen Sie auf ein KV-Binding:

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" }),
		}),
	],
});

Einrichtung

Erstellen Sie einen KV-Namespace und fügen Sie das Binding zu Ihrer Wrangler-Konfiguration hinzu.

npx wrangler kv namespace create CACHE

Der Befehl gibt eine Namespace-id aus. Fügen Sie sie unter dem in kvCache verwendeten Binding-Namen hinzu:

wrangler.jsonc

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

wrangler.toml

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

Optionen

OptionTypStandardBeschreibung
bindingstringKV-Binding-Name aus Ihrer Wrangler-Konfiguration. Erforderlich.
defaultTtlnumber3600Time-to-Live für gecachte Einträge, in Sekunden. KV erzwingt ein Minimum von 60 Sekunden.
revalidatenumber1000Isolate-lokales Epochen-Wiederverwendungsfenster, in Millisekunden. Siehe Aktualität.
timeoutnumber2000Maximale Zeit in Millisekunden, die auf eine KV-Operation gewartet wird, bevor sie als Cache-Miss behandelt wird. Schützt davor, dass ein blockierter KV-Lesevorgang die Anfrage aufhält. Auf 0 setzen zum Deaktivieren.
keyPrefixstring"em"Präfix für jeden Cache-Schlüssel. Setzen Sie einen eindeutigen Wert, wenn mehrere Sites einen Namespace teilen.

Node.js (Memory)

Der Memory-Adapter cached innerhalb des Serverprozesses. Er benötigt keinen externen Dienst:

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

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

Optionen

OptionTypStandardBeschreibung
defaultTtlnumber3600Time-to-Live für gecachte Einträge, in Sekunden.
revalidatenumber1000Isolate-lokales Epochen-Wiederverwendungsfenster, in ms.
maxEntriesnumber1000Maximale Anzahl gecachter Schlüssel, bevor ältere Schlüssel verdrängt werden.
keyPrefixstring"em"Präfix für jeden Cache-Schlüssel.

Was gecacht wird

Der Objekt-Cache deckt die Lesezugriffe ab, die bei einem typischen Seitenrender auftreten:

  • Inhaltsabfragen: getEmDashCollection, getEmDashEntry und resolveEmDashPath.
  • Seiteneinstellungen, Navigationsmenüs und Taxonomiebegriffe.

Admin-API-Anfragen, Mediendateien und vollständige HTML-Antworten werden hier nicht behandelt. Für das Caching gerenderter HTML-Seiten am Edge siehe Auf Cloudflare bereitstellen.

Aktualität

Das Bearbeiten von Inhalten über das Admin-Panel oder die REST-API invalidiert die betroffenen Cache-Einträge automatisch. Das Erstellen, Aktualisieren, Veröffentlichen oder Löschen eines Eintrags löscht die gecachten Abfragen für seine Kollektion; das Ändern einer Autorenzeile oder eines Taxonomiebegriffs löscht die Einträge, die ihn anzeigen.

Für anonyme Besucher dauert es nach einer Änderung einige Zeit, bis sie in allen Isolates sichtbar ist, wenn diese die aktualisierte Epoche übernehmen. Mit dem In-Isolate-Memory-Backend ist dies sofort. Bei Workers KV ist es begrenzt durch KVs Edge-Cache-Propagierung (Eventual Consistency, bis zu ~60 Sekunden) plus das Isolate-lokale revalidate-Fenster (Standard eine Sekunde). Senken Sie revalidate für schnellere lokale Propagierung auf Kosten von mehr Lesezugriffen auf den Cache; erhöhen Sie es, um den Cache seltener zu lesen.

Geplante Inhalte

Geplante Einträge werden sichtbar, wenn ihre Veröffentlichungszeit abgelaufen ist. Eine gecachte Seite spiegelt einen neu veröffentlichten geplanten Eintrag bei der nächsten Änderung an seiner Kollektion wider, oder wenn die defaultTtl des gecachten Eintrags abläuft. Wenn präzise geplante Veröffentlichung für Ihre Site wichtig ist, setzen Sie eine niedrigere defaultTtl.