Cache de objetos

Nesta página

O EmDash lê o conteúdo e a configuração do site da base de dados em cada pedido. A cache de objetos armazena esses resultados de consultas num armazenamento rápido de chave/valor, para que pedidos repetidos sejam servidos a partir da cache em vez da base de dados. Reduz a carga de leitura na base de dados — útil no Cloudflare, onde o KV serve muito mais pedidos por segundo do que o D1.

A cache de objetos é opcional e está desativada por defeito. Ative-a adicionando um adaptador objectCache à integração emdash().

Visão geral

BackendIdeal paraPartilhado entre isolates
KVCloudflare WorkersSim
MemoryNode.js, desenvolvimento localNão (por processo)

No Cloudflare, os pedidos são servidos por muitos isolates de curta duração em diferentes regiões. O KV é partilhado por todos, portanto um valor em cache por um pedido está disponível para o seguinte, em qualquer lugar. O backend de memória faz cache dentro de um único processo, adequado para um servidor Node.js de longa duração.

Cloudflare KV

Configure o adaptador KV e aponte-o para um 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" }),
		}),
	],
});

Configuração

Crie um namespace KV e adicione o binding à sua configuração Wrangler.

npx wrangler kv namespace create CACHE

O comando imprime um id de namespace. Adicione-o sob o nome de binding usado em kvCache:

wrangler.jsonc

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

wrangler.toml

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

Opções

OpçãoTipoPadrãoDescrição
bindingstringNome do binding KV da sua configuração Wrangler. Obrigatório.
defaultTtlnumber3600Tempo de vida para entradas em cache, em segundos. O KV impõe um mínimo de 60 segundos.
revalidatenumber1000Janela de reutilização de época local do isolate, em milissegundos. Ver Frescura.
timeoutnumber2000Tempo máximo em milissegundos para esperar uma operação KV antes de tratá-la como cache miss. Protege contra uma leitura KV bloqueada que suspende o pedido. Definir como 0 para desativar.
keyPrefixstring"em"Prefixo para cada chave de cache. Defina um valor único quando vários sites partilham um namespace.

Node.js (memória)

O adaptador de memória faz cache dentro do processo do servidor. Não necessita de nenhum serviço 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(),
		}),
	],
});

Opções

OpçãoTipoPadrãoDescrição
defaultTtlnumber3600Tempo de vida para entradas em cache, em segundos.
revalidatenumber1000Janela de reutilização de época local do isolate, em ms.
maxEntriesnumber1000Número máximo de chaves em cache antes de despejar as mais antigas.
keyPrefixstring"em"Prefixo para cada chave de cache.

O que é armazenado em cache

A cache de objetos cobre as leituras que são executadas num rendering de página típico:

  • Consultas de conteúdo: getEmDashCollection, getEmDashEntry e resolveEmDashPath.
  • Definições do site, menus de navegação e termos de taxonomia.

Pedidos da API admin, ficheiros multimédia e respostas HTML completas não são tratados aqui. Para fazer cache de HTML renderizado na periferia, veja Implementar no Cloudflare.

Frescura

A edição de conteúdo através do painel de administração ou da API REST invalida automaticamente as entradas de cache afetadas. A criação, atualização, publicação ou eliminação de uma entrada limpa as consultas em cache para a sua coleção; a alteração de uma assinatura ou termo de taxonomia limpa as entradas que o exibem.

Para visitantes anónimos, uma alteração demora algum tempo a aparecer em todos os isolates à medida que estes obtêm a época atualizada. Com o backend de memória intra-isolate, isto é imediato. Com Workers KV, está limitado pela propagação da cache de periferia do KV (consistência eventual, até ~60 segundos) mais a janela revalidate local do isolate (predefinição um segundo). Diminua revalidate para propagação local mais rápida ao custo de mais leituras na cache; aumente-o para ler a cache com menos frequência.

Conteúdo agendado

As entradas agendadas tornam-se visíveis quando o seu horário de publicação passa. Uma página em cache reflete uma entrada agendada recém-publicada na próxima alteração à sua coleção, ou quando o defaultTtl da entrada em cache expira. Se a publicação agendada precisa é importante para o seu site, defina um defaultTtl mais baixo.