Cloudflare KV: エッジで動く超低遅延グローバルKey-Valueストレージ
Cloudflare Workers KVの基礎から仕組み、アーキテクチャ図、使い所、RedisやVPS RAM、DynamoDBとの徹底比較までわかりやすく解説。
モダンなWeb開発において、画像やHTMLなどの静的アセットをCDNでキャッシュするのは一般的です。しかし、世界中のユーザーへミリ秒未満の超低遅延で提供したい動的なアプリケーションデータはどう管理すべきでしょうか?
そこで活躍するのが Cloudflare Workers KV(Key-Value)です。エッジ環境において高頻度な読み込みに特化した、グローバル分散型のサーバーレスKey-Valueストレージです。
1. Cloudflare KVとは?(子どもでもわかる解説)#
世界中に330店舗以上ある国際的なカフェチェーンを想像してみてください。
- もし東京・ロンドン・ニューヨークのバリスタが、当日の割引メニューを確認するために毎回カリフォルニアの本社へ国際電話をかけていたら、お客さんは待ちくたびれてしまいます。
- Cloudflare KV は、割引メニューのコピーをあらかじめ世界中の全店舗のレジ横に置いておく仕組みです。
- お客さんが来たら、レジ横のメモを一瞬で確認できます(1ms未満のローカル読み込み)。本社が価格を変更したときは、数秒〜数十秒以内に全店舗へ新しいコピーが届けられます(結果整合性: Eventual Consistency)。
flowchart TD
subgraph GlobalEdge["Cloudflare グローバルエッジ (330+拠点)"]
direction LR
Edge1["🇯🇵 東京エッジ<br/>ローカルKVキャッシュ (~1ms)"]
Edge2["🇬🇧 ロンドンエッジ<br/>ローカルKVキャッシュ (~1ms)"]
Edge3["🇺🇸 NYエッジ<br/>ローカルKVキャッシュ (~1ms)"]
end
subgraph Central["中央KVストレージ層"]
CoreDB["グローバルコアストレージ<br/>永続化層"]
end
ClientTokyo["📱 東京のユーザー"] -->|GET /config| Edge1
ClientLondon["📱 ロンドンのユーザー"] -->|GET /config| Edge2
ClientNY["📱 NYのユーザー"] -->|GET /config| Edge3
Admin["💻 管理者 / バックエンド"] -->|PUT key=value 書き込み| CoreDB
CoreDB -.->|非同期エッジレプリケーション| Edge1
CoreDB -.->|非同期エッジレプリケーション| Edge2
CoreDB -.->|非同期エッジレプリケーション| Edge3
2. Cloudflare KVの主な特徴#
- 圧倒的な読み取りスループット: 世界中で毎秒数百万件の読み込みリクエストを処理可能。
- Read-Local / Write-Central モデル: 書き込みは中央ストレージに集約され、世界330以上のデータセンターへ非同期に配信されます。
- 結果整合性(Eventual Consistency): 書き込み後、世界中の全エッジに約60秒以内にデータが伝播します。
- シンプルなKVSモデル: キーは最大512バイト、バリューは最大25MBまで格納可能。
- TTL(有効期限)の標準サポート:
expirationTtlやexpirationを指定してキーの自動失効が可能。 - 軽量メタデータの付与: キーに最大1KBのJSONメタデータを紐付け、本体をダウンロードせずに高速判定が可能。
3. Cloudflare KVの使い方#
wrangler.toml でのバインディング設定#
wrangler.toml
name = "my-edge-app"
main = "src/index.ts"
compatibility_date = "2026-08-01"
[[kv_namespaces]]
binding = "CONFIG_KV"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"tomlWorkers(TypeScript)での実装コード#
src/index.ts
export interface Env {
CONFIG_KV: KVNamespace;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
// 1. KVからJSONを取得
if (request.method === 'GET' && url.pathname === '/feature-flags') {
const flags = await env.CONFIG_KV.get('feature_flags', 'json');
return Response.json(flags || { betaFeature: false });
}
// 2. 有効期限(TTL: 5分)付きでKVに保存
if (request.method === 'POST' && url.pathname === '/feature-flags') {
const body = await request.json();
await env.CONFIG_KV.put('feature_flags', JSON.stringify(body), {
expirationTtl: 300, // 5分
});
return Response.json({ success: true }, { status: 201 });
}
// 3. キーの削除
if (request.method === 'DELETE') {
await env.CONFIG_KV.delete('feature_flags');
return new Response('Deleted', { status: 200 });
}
return new Response('Cloudflare KV Demo', { status: 200 });
},
};typescript4. 比較: Cloudflare KV vs 単一VPSのインメモリRAM (Redis) vs DynamoDB#
Cloudflare KVと、VPS上で動かすRedisやAWS DynamoDBとのアーキテクチャの違いを見てみましょう:
flowchart LR
subgraph VPS["単一VPS / 自前Redis"]
direction TB
Server["VPS (RAMキャッシュ)"]
UserUS["🇺🇸 USユーザー (高速 ~5ms)"] --> Server
UserAsia["🇯🇵 アジアユーザー (遅延 ~200ms)"] --> Server
end
subgraph CF["Cloudflare KV グローバル分散"]
direction TB
KV_US["🇺🇸 US エッジKV (~1ms)"]
KV_JP["🇯🇵 日本エッジKV (~1ms)"]
UserUS2["🇺🇸 USユーザー"] --> KV_US
UserJP2["🇯🇵 日本ユーザー"] --> KV_JP
end
特徴比較表#
| 比較項目 | Cloudflare KV | VPS インメモリRAM (Redis) | AWS DynamoDB / Global Tables |
|---|---|---|---|
| グローバル展開 | 330以上のエッジPoPに自動展開 | 単一リージョン(クラスタ自作が必要) | マルチリージョン設定が必要 |
| 読み込みレイテンシ | ユーザー最寄りのエッジで < 1ms | 距離に応じて150〜300msの遅延 | リージョン内で5〜15ms |
| 書き込みの整合性 | 結果整合性(約60秒で全同期) | 即時整合性(強い整合性) | 設定可能な強い整合性 |
| 書き込みスループット | キーあたり約1回/秒 | 毎秒10万回以上の超高速書き込み | プロビジョニングに応じて拡張可能 |
| 運用保守コスト | ゼロ(完全サーバーレス) | 高い(OS更新、冗長化、バックアップ) | 中程度(IAM・キャパシティ設計) |
| 料金体系 | 従量課金($0.50/GB、無料枠あり) | サーバー固定費(月額50+) | リクエスト数・容量課金 |
| データ容量制限 | 1値あたり最大25MB | サーバーRAM容量に依存 | 1アイテムあたり最大400KB |
5. Cloudflare KVの使い所(向いている用途・不向きな用途)#
最適なユースケース(Read過多・低頻度Write)#
- 機能フラグ(Feature Flags)と動的設定: 再デプロイ不要で機能を即座に切り替え。
- ユーザー認証トークン・APIキーの検証: エッジで素早くアクセス権限を判定。
- URL短縮サービス・リダイレクト管理: 短縮スラッグから転送先URLへ即時リダイレクト。
- A/Bテストの配信制御: ユーザーの地域や属性に応じた設定の出し分け。
- APIレスポンスのキャッシュ(Cache-Aside): オリジンDBへの負荷を削減。
向いていないユースケース#
- リアルタイムカウンター・頻繁な数値インクリメント: キーあたり秒間1回の書き込み制限があるため、Durable Objects や D1 を推奨。
- 金融決済やトランザクション処理: 厳密な即時整合性(ACID)が必要な処理。
- 複雑なリレーショナル検索・フィルタリング: キー完全一致または前方一致のみ対応。テーブル結合が必要な場合は Cloudflare D1(SQLite)を利用。
6. まとめ#
Cloudflare KVを使えば、世界中に広がる分散キャッシュ基盤を env.KV.get('key') という簡単なコードだけで手に入れることができます。「読み込み頻度が高く、世界中から超高速に参照でき、サーバー管理を一切したくない」 という要件において、Cloudflare KVは最も費用対効果の高い選択肢です。