Caché de objetos

En esta página

EmDash lee el contenido y la configuración del sitio desde la base de datos en cada solicitud. La caché de objetos almacena esos resultados de consultas en un almacén rápido de clave/valor, de modo que las solicitudes repetidas se sirven desde la caché en lugar de la base de datos. Reduce la carga de lectura en la base de datos — útil en Cloudflare, donde KV sirve muchas más solicitudes por segundo que D1.

La caché de objetos es opcional y está deshabilitada por defecto. Habilítala añadiendo un adaptador objectCache a la integración emdash().

Visión general

BackendIdeal paraCompartido entre isolates
KVCloudflare Workers
MemoryNode.js, desarrollo localNo (por proceso)

En Cloudflare, las solicitudes son servidas por muchos isolates de corta duración en diferentes regiones. KV es compartido por todos ellos, así que un valor almacenado en caché por una solicitud está disponible para la siguiente, en cualquier lugar. El backend de memoria almacena dentro de un único proceso, lo cual es adecuado para un servidor Node.js de larga duración.

Cloudflare KV

Configura el adaptador KV y apúntalo a un binding de 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" }),
		}),
	],
});

Configuración

Crea un namespace KV y añade el binding a tu configuración de Wrangler.

npx wrangler kv namespace create CACHE

El comando imprime un id de namespace. Añádelo bajo el nombre de binding usado en kvCache:

wrangler.jsonc

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

wrangler.toml

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

Opciones

OpciónTipoPor defectoDescripción
bindingstringNombre del binding KV de tu configuración de Wrangler. Requerido.
defaultTtlnumber3600Tiempo de vida para entradas en caché, en segundos. KV impone un mínimo de 60 segundos.
revalidatenumber1000Ventana de reutilización de época local del isolate, en milisegundos. Ver Frescura.
timeoutnumber2000Tiempo máximo en milisegundos para esperar una operación KV antes de tratarla como miss de caché. Protege contra una lectura KV bloqueada que detenga la solicitud. Establecer a 0 para desactivar.
keyPrefixstring"em"Prefijo para cada clave de caché. Establece un valor único cuando varios sitios comparten un namespace.

Node.js (memoria)

El adaptador de memoria almacena en caché dentro del proceso del servidor. No necesita ningún servicio externo:

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

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

Opciones

OpciónTipoPor defectoDescripción
defaultTtlnumber3600Tiempo de vida para entradas en caché, en segundos.
revalidatenumber1000Ventana de reutilización de época local del isolate, en ms.
maxEntriesnumber1000Número máximo de claves en caché antes de desalojar las más antiguas.
keyPrefixstring"em"Prefijo para cada clave de caché.

Qué se almacena en caché

La caché de objetos cubre las lecturas que se ejecutan en un renderizado de página típico:

  • Consultas de contenido: getEmDashCollection, getEmDashEntry y resolveEmDashPath.
  • Configuración del sitio, menús de navegación y términos de taxonomía.

Las solicitudes de la API de administración, los archivos multimedia y las respuestas HTML completas no se manejan aquí. Para almacenar en caché HTML renderizado en el edge, consulta Desplegar en Cloudflare.

Frescura

Editar contenido a través del panel de administración o la API REST invalida automáticamente las entradas de caché afectadas. Crear, actualizar, publicar o eliminar una entrada limpia las consultas en caché para su colección; cambiar una firma o un término de taxonomía limpia las entradas que lo muestran.

Para los visitantes anónimos, un cambio tarda un tiempo en aparecer en todos los isolates a medida que estos recogen la época actualizada. Con el backend de memoria dentro del isolate esto es inmediato. Con Workers KV está limitado por la propagación de la caché edge de KV (consistencia eventual, hasta ~60 segundos) más la ventana revalidate local del isolate (por defecto un segundo). Reduce revalidate para una propagación local más rápida a costa de más lecturas contra la caché; auméntalo para leer la caché con menos frecuencia.

Contenido programado

Las entradas programadas se hacen visibles cuando pasa su hora de publicación. Una página en caché refleja una entrada programada recién publicada en el siguiente cambio a su colección, o cuando el defaultTtl de la entrada en caché caduca. Si la publicación programada precisa importa para tu sitio, establece un defaultTtl más bajo.