Configurer le cache objet

Sur cette page

Le cache par requête d’EmDash déduplique déjà les lectures identiques pendant le rendu d’une page. Le cache objet optionnel conserve certains résultats de requêtes entre les requêtes, permettant à une requête ultérieure d’éviter la même lecture de base de données. Il est utile lorsque le trafic public crée plus de lectures de base de données que le backend choisi ne devrait gérer.

La base de données reste la source de vérité. Les lectures du cache échouent ouvertement vers la base de données, et les écritures invalident le namespace de cache affecté. Le cache objet est désactivé par défaut ; activez-le en ajoutant un adaptateur objectCache à l’intégration emdash().

Aperçu

BackendIdéal pourPartagé entre isolats
KVCloudflare WorkersOui
MemoryNode.js, développement localNon (par processus)

Sur Cloudflare, les requêtes sont servies par de nombreux isolats éphémères à travers les régions. KV est partagé par tous, donc une valeur mise en cache par une requête est disponible pour la suivante, partout. Le backend mémoire met en cache au sein d’un seul processus, ce qui convient à un serveur Node.js longue durée.

Cloudflare KV

Configurez l’adaptateur KV et pointez-le vers 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" }),
		}),
	],
});

Installation

Créez un namespace KV et ajoutez le binding à votre configuration Wrangler.

npx wrangler kv namespace create CACHE

La commande affiche un id de namespace. Ajoutez-le sous le nom du binding utilisé dans kvCache :

wrangler.jsonc

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

wrangler.toml

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

Options

OptionTypePar défautDescription
bindingstring—Nom du binding KV de votre configuration Wrangler. Requis.
defaultTtlnumber3600Durée de vie des entrées en cache, en secondes. KV impose un minimum de 60 secondes.
revalidatenumber1000Fenêtre de réutilisation d’epoch locale à l’isolat, en millisecondes. Voir Fraîcheur.
timeoutnumber2000Temps maximum, en millisecondes, pour attendre une opération KV avant de la traiter comme un défaut de cache. Protège contre une lecture KV bloquée qui fige la requête. Définir à 0 pour désactiver.
keyPrefixstring"em"Préfixe pour chaque clé de cache. Définir une valeur unique lorsque plusieurs sites partagent un namespace.

Node.js (mémoire)

L’adaptateur mémoire met en cache au sein du processus serveur. Il ne nécessite aucun service externe :

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

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

Options

OptionTypePar défautDescription
defaultTtlnumber3600Durée de vie des entrées en cache, en secondes.
revalidatenumber1000Fenêtre de réutilisation d’epoch locale à l’isolat, en ms.
maxEntriesnumber1000Nombre maximum de clés en cache avant éviction des plus anciennes.
keyPrefixstring"em"Préfixe pour chaque clé de cache.

Ce qui est mis en cache

Le cache objet couvre les lectures exécutées lors d’un rendu de page typique :

  • Requêtes de contenu : getEmDashCollection, getEmDashEntry et resolveEmDashPath.
  • Paramètres du site, menus de navigation et termes de taxonomie.

Les requêtes de l’API admin, les fichiers média et les réponses HTML complètes ne sont pas traitées ici. Pour mettre en cache le HTML rendu en edge, voir Déployer sur Cloudflare.

Le cache objet et un cache HTML en edge résolvent des problèmes différents. Un succès dans la couche HTML n’exécute pas EmDash. Un défaut de cache exécute le Worker, et une réponse qui peut remplir le cache de routes d’Astro contourne le cache objet. Ses requêtes de contenu lisent depuis la base de données, ce qui empêche une page purgée après un changement de contenu d’être reconstruite avec un ancien instantané KV.

Fraîcheur

La modification de contenu via le panneau d’administration ou l’API REST invalide automatiquement les entrées de cache affectées. Créer, mettre à jour, publier ou supprimer une entrée efface les requêtes en cache pour sa collection ; modifier un nom d’auteur ou un terme de taxonomie efface les entrées qui l’affichent.

Pour les requêtes qui ne remplissent pas le cache de routes, un changement met du temps à apparaître sur tous les isolats à mesure qu’ils récupèrent l’epoch incrémenté. Avec le backend mémoire en isolat, c’est immédiat. Avec Workers KV, c’est limité par la propagation du cache edge de KV (cohérence éventuelle, jusqu’à ~60 secondes) plus la fenêtre revalidate locale à l’isolat (par défaut une seconde). Réduisez revalidate pour une propagation locale plus rapide au prix de plus de lectures contre le cache ; augmentez-le pour lire le cache moins souvent.

Contenu planifié

Les entrées planifiées deviennent visibles lorsque leur heure de publication arrive. Une page en cache reflète une entrée planifiée nouvellement publiée au prochain changement de sa collection, ou lorsque le defaultTtl de l’entrée en cache expire. Si la publication planifiée précise est importante pour votre site, définissez un defaultTtl plus bas.