mcpField
V
vercel-kv

vercel-kv

github.com/secondskyデータ・データベース240123 回インストール5 週間前に更新
リポジトリ

vercel-kv について

Redis互換ストレージサービスVercel KVをアプリで利用するための開発スキルです。基本操作に加え、キャッシュ、セッション、レート制限、ロック、ランキングのパターンを説明します。

主な機能

  1. 01Redis互換のキー・バリュー操作
  2. 02TTLによる有効期限とアトミックコマンド
  3. 03複数キーとパイプライン操作
  4. 04キャッシュ、セッション、レート制限のパターン
  5. 05トラブルシューティングと設定ガイド

活用シーン

  1. 01アプリケーションデータのキャッシュ
  2. 02期限付きユーザーセッションの管理
  3. 03APIのレート制限
  4. 04分散ロックによる並行タスクの調整

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill vercel-kv

インストール後、Claude Code で/vercel-kvを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
example-template.txt
references/
common-patterns.md
known-issues.md
scripts/
example-script.sh
templates/
package.json
session-management.ts
simple-rate-limiting.ts

詳細

Vercel KV(Redis 互換ストレージ)

ステータス:本番環境で利用可能 最終更新日:2025-12-14 依存関係:なし 最新バージョン:@vercel/[email protected]


クイックスタート(3 分)

1. 作成と設定
# Create KV database in Vercel dashboard: Storage → Create Database → KV
vercel env pull .env.local

環境変数が作成されます:

  • KV_REST_API_URL - KV データベースの URL
  • KV_REST_API_TOKEN - 認証トークン
2. インストール
bun add @vercel/kv
3. アプリで使用する

Next.js サーバーアクション:

'use server';

import { kv } from '@vercel/kv';

export async function incrementViews(slug: string) {
  const views = await kv.incr(`views:${slug}`);
  return views;
}

エッジ API ルート:

import { kv } from '@vercel/kv';

export const runtime = 'edge';

export async function GET(request: Request) {
  const value = await kv.get('mykey');
  return Response.json({ value });
}

重要なルール

必ず行うこと
ルール理由
一時データには TTL を設定するsetex('key', 3600, value) - メモリリークを防ぎます
名前空間付きのキーを使用する123 ではなく user:123:profile を使い、衝突を防ぎます
null の戻り値を処理する存在しないキーは null を返します
バッチ処理にはパイプラインを使用する1 回の往復でレイテンシを低減できます
JSON 互換データのみをシリアライズする関数や循環参照は使用できません
コマンドの使用量を監視する無料枠(月間 30K 件)の範囲内に収めます
絶対に行わないこと
ルール理由
機密データを暗号化せずに保存するKV はデフォルトで保存時に暗号化されません
TTL の設定を忘れるTTL のないキーは無期限に残ります
汎用的なキー名を使用するdata や cache は衝突します
大きな値(>1MB)を保存する代わりに Vercel Blob を使用します
プライマリデータベースとして使用するKV はキャッシュ用であり、永続化用ではありません
.env.local をコミットするKV トークンが含まれています

主な操作

TTL 付きの設定/取得:

import { kv } from '@vercel/kv';

// Set with TTL (expires in 1 hour)
await kv.setex('session:abc', 3600, { userId: 123 });

// Get value
const session = await kv.get('session:abc');

// Delete
await kv.del('session:abc');

アトミック操作:

const views = await kv.incr('views:post:123');
const wasSet = await kv.setnx('lock:process', 'running'); // Set if not exists

複数のキー:

const values = await kv.mget('user:1', 'user:2', 'user:3');
await kv.mset({ 'user:1': data1, 'user:2': data2 });

既知の問題の予防

このスキルでは、記録されている 10 件の問題を予防できます:

#エラー簡単な修正方法
1KV_REST_API_URL not definedvercel env pull .env.local を実行します
2Cannot serialize BigInt文字列に変換し、プレーンオブジェクトを使用します
3予期しないデータが返される名前空間付きのキーを使用します:user:123:profile
4メモリ使用量が際限なく増えるTTL 付きで setex() を使用します
5レート制限を超過する操作をまとめて実行するか、プランをアップグレードします
6値が大きすぎる100KB を超える場合は Vercel Blob を使用します
7TypeScript の型エラーZod による検証とともに kv.get<Type>() を使用します
8パイプラインが失敗しても通知されないexec() の結果配列を確認します
9Scan のタイムアウトエラー件数を制限し、カーソルを使って繰り返し処理します
10セッションの有効期限が早すぎるスライディングウィンドウには expire() を使用します

参照先:コード例を含む完全な解決方法については、references/known-issues.md をご覧ください。


よく使われるパターンの概要

パターン用途主な API
キャッシュアサイド読み取りのキャッシュget → fetch → setex
ライトスルー書き込みの一貫性書き込み時に setex、削除時に del
レート制限API の保護incr + expire
セッション管理ユーザーセッションsetex、get、expire、del
分散ロック並行制御setnx + expire + del
リーダーボードランキングzadd、zrange、zrevrank
パイプラインバッチ操作pipeline().exec()

参照先:完全な実装については、references/common-patterns.md をご覧ください。


設定

.env.local
# Created by: vercel env pull .env.local
KV_REST_API_URL="https://your-database.kv.vercel-storage.com"
KV_REST_API_TOKEN="your-token-here"
.gitignore
.env.local
.env*.local

リファレンスを読み込むタイミング

リファレンス読み込むタイミング
references/known-issues.mdKV のエラー、型の問題、またはパフォーマンスの問題をデバッグするとき
references/common-patterns.mdキャッシュ、セッション、レート制限、リーダーボード、またはロックを実装するとき

依存関係

{
  "dependencies": {
    "@vercel/kv": "^3.0.0"
  }
}

無料枠の上限:月間 30,000 コマンド、256MB のストレージ


公式ドキュメント


トラブルシューティング

問題解決策
KV_REST_API_URL not definedvercel env pull .env.local を実行します
レート制限を超過しましたmget/パイプラインを使用するか、プランをアップグレードします
値の有効期限が切れないset() ではなく setex() を使用します
JSON のシリアル化エラー通常のオブジェクトを使用し、BigInt を文字列に変換します

トークンの節約:~60%(パターンをリファレンスに抽出) エラーの防止:100%(文書化された問題 10 件すべて) 本番環境で使用する準備ができました!

コメント