오브젝트 캐시 구성

이 페이지

EmDash의 요청별 캐시는 이미 한 페이지 렌더링 중 동일한 읽기를 중복 제거합니다. 선택적 오브젝트 캐시는 요청 간에 선택된 쿼리 결과를 유지하여, 이후 요청이 동일한 데이터베이스 읽기를 피할 수 있게 합니다. 공개 트래픽이 선택한 백엔드가 감당하기 어려울 만큼 많은 데이터베이스 읽기를 만들 때 유용합니다.

데이터베이스는 진실의 원천으로 남습니다. 캐시 읽기는 실패하면 데이터베이스에서 읽고, 쓰기는 영향받는 캐시 네임스페이스를 무효화합니다. 오브젝트 캐시는 기본적으로 비활성화되어 있습니다. emdash() 통합에 objectCache 어댑터를 추가하여 활성화하세요.

개요

백엔드최적 용도격리 간 공유
KVCloudflare Workers예
MemoryNode.js, 로컬 개발아니오 (프로세스별)

Cloudflare에서는 요청이 여러 리전의 수많은 단기 격리(isolate)에서 처리됩니다. KV는 이들 모두가 공유하므로, 한 요청에서 캐시한 값은 다음 요청에서 어디서든 사용할 수 있습니다. 메모리 백엔드는 단일 프로세스 안에서만 캐시하므로 장기 실행 Node.js 서버에 적합합니다.

Cloudflare KV

KV 어댑터를 구성하고 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" }),
		}),
	],
});

설정

KV 네임스페이스를 만들고 Wrangler 구성에 바인딩을 추가합니다.

npx wrangler kv namespace create CACHE

명령은 네임스페이스 id를 출력합니다. kvCache에서 사용하는 바인딩 이름 아래에 추가하세요.

wrangler.jsonc

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

wrangler.toml

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

옵션

옵션타입기본값설명
bindingstring—Wrangler 구성의 KV 바인딩 이름. 필수.
defaultTtlnumber3600캐시 항목의 TTL(초). KV는 최소 60초를 적용합니다.
revalidatenumber1000격리 로컬 epoch 재사용 창(밀리초). 신선도 참조.
timeoutnumber2000KV 작업을 기다리는 최대 시간(밀리초). 초과하면 캐시 미스로 처리합니다. 응답 없이 멈춘 KV 읽기로 요청이 지연되는 것을 방지합니다. 0으로 비활성화할 수 있습니다.
keyPrefixstring"em"모든 캐시 키의 접두사. 여러 사이트가 하나의 네임스페이스를 공유할 때는 고유한 값을 설정하세요.

Node.js (메모리)

메모리 어댑터는 서버 프로세스 안에서 캐시합니다. 외부 서비스가 필요 없습니다.

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

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

옵션

옵션타입기본값설명
defaultTtlnumber3600캐시 항목의 TTL(초).
revalidatenumber1000격리 로컬 epoch 재사용 창(ms).
maxEntriesnumber1000오래된 키를 제거하기 전에 보관할 최대 캐시 키 수.
keyPrefixstring"em"모든 캐시 키의 접두사.

캐시되는 내용

오브젝트 캐시는 일반적인 페이지 렌더링에서 실행되는 읽기를 다룹니다.

  • 콘텐츠 쿼리: getEmDashCollection, getEmDashEntry, resolveEmDashPath.
  • 사이트 설정, 내비게이션 메뉴, 택소노미 용어.

관리자 API 요청, 미디어 파일, 전체 HTML 응답은 여기서 처리되지 않습니다. 렌더링된 HTML을 엣지에서 캐시하려면 Cloudflare에 배포를 참조하세요.

오브젝트 캐시와 HTML 엣지 캐시는 서로 다른 문제를 해결합니다. HTML 레이어에서 캐시 히트가 나면 EmDash는 실행되지 않습니다. 미스가 나면 Worker가 실행되며, Astro의 route cache를 채울 수 있는 응답은 오브젝트 캐시를 우회합니다. 해당 콘텐츠 쿼리는 데이터베이스에서 읽으며, 콘텐츠 변경 후 캐시가 무효화된 페이지가 오래된 KV 스냅샷으로 다시 빌드되는 것을 방지합니다.

신선도

관리자 패널이나 REST API를 통해 콘텐츠를 편집하면 영향받는 캐시 항목이 자동으로 무효화됩니다. 항목을 생성, 업데이트, 게시 또는 삭제하면 해당 컬렉션의 캐시된 쿼리가 지워집니다. 바이라인이나 택소노미 용어를 변경하면 이를 표시하는 항목의 캐시가 지워집니다.

route cache를 채우는 요청이 아닌 경우, 각 격리가 갱신된 epoch를 받아들이면서 변경 사항이 모든 격리에 반영되기까지 시간이 걸립니다. 격리 내 메모리 백엔드에서는 즉시 반영됩니다. Workers KV에서는 KV의 엣지 캐시 전파(최종 일관성, 최대 ~60초)와 격리 로컬 revalidate 창(기본 1초)으로 상한이 정해집니다. 더 빠른 로컬 전파를 원하면 revalidate를 낮추되, 캐시에 대한 읽기가 늘어납니다. 캐시를 덜 자주 읽으려면 값을 높이세요.

예약된 콘텐츠

예약된 항목은 게시 시간이 지나면 표시됩니다. 캐시된 페이지는 해당 컬렉션이 다음으로 변경되거나, 캐시된 항목의 defaultTtl이 만료될 때 새로 게시된 예약 항목을 반영합니다. 사이트에서 정확한 예약 게시가 중요하다면 defaultTtl을 더 낮게 설정하세요.