오브젝트 캐시 구성

이 페이지

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

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

개요

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

Cloudflare에서 요청은 여러 리전의 수많은 단기 격리에 의해 처리됩니다. 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>"

옵션

옵션타입기본값설명
bindingstringWrangler 구성의 KV 바인딩 이름. 필수.
defaultTtlnumber3600캐시된 항목의 유효 기간(초). KV는 최소 60초를 강제합니다.
revalidatenumber1000격리 로컬 에포크 재사용 창(밀리초). 신선도 참조.
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캐시된 항목의 유효 기간(초).
revalidatenumber1000격리 로컬 에포크 재사용 창(ms).
maxEntriesnumber1000오래된 키가 제거되기 전 최대 캐시 키 수.
keyPrefixstring"em"모든 캐시 키의 접두사.

캐시되는 내용

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

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

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

오브젝트 캐시와 HTML 엣지 캐시는 다른 문제를 해결합니다. HTML 레이어에서의 캐시 미스는 여전히 Worker를 실행합니다. 그때 오브젝트 캐시가 반복적인 콘텐츠 쿼리를 방지할 수 있습니다. HTML 레이어에서의 캐시 히트는 EmDash를 전혀 실행하지 않습니다.

신선도

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

익명 방문자의 경우, 모든 격리가 업데이트된 에포크를 가져옴에 따라 변경 사항이 표시되기까지 시간이 걸립니다. 격리 내 메모리 백엔드에서는 즉각적입니다. Workers KV에서는 KV의 엣지 캐시 전파(최종 일관성, 최대 ~60초)와 격리 로컬 revalidate 창(기본 1초)에 의해 제한됩니다. 캐시에 대한 더 많은 읽기 비용으로 더 빠른 로컬 전파를 위해 revalidate를 낮추세요. 캐시를 덜 자주 읽으려면 높이세요.

예약된 콘텐츠

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