O cache por requisição do EmDash já deduplica leituras idênticas durante a renderização de uma página. O cache de objetos opcional mantém resultados de consultas selecionados entre requisições, permitindo que uma requisição posterior evite a mesma leitura no banco de dados. É útil quando o tráfego público gera mais leituras no banco do que o backend escolhido deveria suportar.
O banco de dados continua sendo a fonte da verdade. Leituras do cache recorrem ao banco de dados em caso de falha (fail open), e gravações invalidam o namespace de cache afetado. O cache de objetos fica desabilitado por padrão; habilite-o adicionando um adaptador objectCache à integração emdash().
Visão geral
| Backend | Melhor para | Compartilhado entre isolados |
|---|---|---|
| KV | Cloudflare Workers | Sim |
| Memory | Node.js, desenvolvimento local | Não (por processo) |
No Cloudflare, as requisições são atendidas por muitos isolados de curta duração em várias regiões. O KV é compartilhado por todos eles, de modo que um valor armazenado em cache por uma requisição fica disponível para a próxima, em qualquer lugar. O backend de memória armazena em cache dentro de um único processo, o que combina com um servidor Node.js de longa execuçã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 à configuração do Wrangler.
npx wrangler kv namespace create CACHE
O comando imprime um id de namespace. Adicione-o com 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ção | Tipo | Padrão | Descrição |
|---|---|---|---|
binding | string | — | Nome do binding KV na configuração do Wrangler. Obrigatório. |
defaultTtl | number | 3600 | Tempo de vida das entradas em cache, em segundos. O KV impõe um mínimo de 60 segundos. |
revalidate | number | 1000 | Janela de reutilização de epoch local ao isolado, em milissegundos. Veja Frescor. |
timeout | number | 2000 | Tempo máximo, em milissegundos, para aguardar uma operação KV antes de tratá-la como cache miss. Evita que uma leitura KV travada prenda a requisição. Defina como 0 para desabilitar. |
keyPrefix | string | "em" | Prefixo de cada chave de cache. Defina um valor exclusivo quando vários sites compartilham um namespace. |
Node.js (memória)
O adaptador de memória armazena em cache dentro do processo do servidor. Não exige 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ção | Tipo | Padrão | Descrição |
|---|---|---|---|
defaultTtl | number | 3600 | Tempo de vida das entradas em cache, em segundos. |
revalidate | number | 1000 | Janela de reutilização de epoch local ao isolado, em ms. |
maxEntries | number | 1000 | Número máximo de chaves em cache antes de remover as mais antigas. |
keyPrefix | string | "em" | Prefixo de cada chave de cache. |
O que é armazenado em cache
O cache de objetos cobre as leituras executadas em uma renderização de página típica:
- Consultas de conteúdo:
getEmDashCollection,getEmDashEntryeresolveEmDashPath. - Configurações do site, menus de navegação e termos de taxonomia.
Requisições da API admin, arquivos de mídia e respostas HTML completas não são tratadas aqui. Para armazenar HTML renderizado em cache na edge, veja Implantar no Cloudflare.
O cache de objetos e um cache HTML na edge resolvem problemas diferentes. Um cache hit na camada HTML não executa o EmDash. Em um cache miss, o Worker é executado, e uma resposta que pode preencher o route cache do Astro ignora o object cache. As consultas de conteúdo dessa resposta leem do banco de dados, o que impede que uma página purgada após uma alteração de conteúdo seja reconstruída com um snapshot KV mais antigo.
Frescor
Editar conteúdo pelo painel admin ou pela API REST invalida automaticamente as entradas de cache afetadas. Criar, atualizar, publicar ou excluir uma entrada limpa as consultas em cache da coleção correspondente; alterar um byline ou um termo de taxonomia limpa as entradas que o exibem.
Para requisições que não são preenchimentos do route cache, uma alteração leva tempo para aparecer em todos os isolados à medida que eles passam a usar o epoch atualizado. Com o backend de memória no isolado, isso é imediato. Com Workers KV, fica limitado pela propagação do edge cache do KV (consistência eventual, até ~60 segundos) somada à janela revalidate local ao isolado (padrão de um segundo). Diminua revalidate para propagação local mais rápida, ao custo de mais leituras contra o cache; aumente para ler o cache com menos frequência.
Conteúdo agendado
Entradas agendadas ficam visíveis quando a hora de publicação é atingida. Uma página em cache reflete uma entrada agendada recém-publicada na próxima alteração na coleção correspondente ou quando o defaultTtl da entrada em cache expira. Se a publicação agendada precisa for importante para o seu site, defina um defaultTtl menor.