0Pricing
C# Academy · レッスン

キャッシュポリシーと無効化

キャッシュの有効期間とタグを制御します。

「キャッシュポリシーと無効化」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

名前付きポリシー

すべてのエンドポイントでキャッシュ設定を繰り返すのではなく、再利用可能な名前付きポリシーを一度定義し、名前で参照します。

builder.Services.AddOutputCache(options =>
{
    options.AddPolicy("Short", policy =>
        policy.Expire(TimeSpan.FromSeconds(10)));
    options.AddPolicy("Long", policy =>
        policy.Expire(TimeSpan.FromMinutes(10)));
});

名前付きポリシーの適用

エンドポイントをキャッシュするときに、ポリシーの名前で参照します。

app.MapGet("/catalog", GetCatalog)
   .CacheOutput("Long");

キャッシュタグ

タグを使うと、関連するキャッシュエントリをグループ化し、それらをまとめて無効化できます。ポリシーで Tag を使ってエンドポイントにタグを付けます。

app.MapGet("/products", GetProducts)
   .CacheOutput(policy => policy
        .Expire(TimeSpan.FromMinutes(5))
        .Tag("products"));

IOutputCacheStore

無効化は IOutputCacheStore を通して行います。これを DI で注入し、EvictByTagAsync を呼び出すと、そのタグが付いたすべてのエントリを削除できます。

app.MapPost("/products", async (
    Product p, AppDb db, IOutputCacheStore cache, CancellationToken ct) =>
{
    db.Products.Add(p);
    await db.SaveChangesAsync(ct);
    await cache.EvictByTagAsync("products", ct);
    return Results.Created($"/products/{p.Id}", p);
});

書き込み時に無効化する理由

基になるデータが変更された瞬間に、キャッシュされた一覧は古くなります。作成、更新、削除のたびに関連するタグを削除すれば、有効期限を待たずに読み取り結果を最新に保てます。

// After any mutation:
await cache.EvictByTagAsync("products", ct);

リソース単位のタグ付け

より細かい単位でタグを付けると、コレクション全体ではなく、1 つの項目のキャッシュされたレスポンスだけを削除できます。

app.MapGet("/products/{id}", GetProduct)
   .CacheOutput(policy => policy.Tag("products"));
// Evict the single item's detail + the list together
await cache.EvictByTagAsync("products", ct);

ポリシーでの Vary-By

有効期限、タグ、Vary-By ルールを 1 つの名前付きポリシーにまとめ、完全なキャッシュ契約を定義します。

options.AddPolicy("ProductList", policy => policy
    .Expire(TimeSpan.FromMinutes(5))
    .Tag("products")
    .SetVaryByQuery("page", "size"));

カスタム Vary-By 値

VaryByValue を使うと、リクエストから解決したテナント ID など、任意のリクエストデータを基にキャッシュキーを作成できます。

policy.VaryByValue(context =>
    new KeyValuePair<string, string>(
        "tenant",
        context.Request.Headers["X-Tenant"].ToString()));

削除と有効期限の違い

エントリがキャッシュからなくなる方法は 2 つあります。

  • 有効期限:時間に基づく仕組みで、Expire により自動的に発生します。
  • 削除:データ変更時に EvictByTagAsync を使って明示的に行います。

両方を使用してください。短い有効期限を安全策とし、正確性を保つために削除を行います。

// belt-and-suspenders: Expire(5min) + EvictByTag on write

ロックとスタンピード対策

出力キャッシュでは、デフォルトで同時に発生したキャッシュミスをまとめて処理します。キャッシュされていないエンドポイントに多数のリクエストが同時に届いた場合、ハンドラーを実行するのは 1 つだけで、残りは待機します。SetLocking(false) でこの動作を無効にできます。

policy.SetLocking(false); // allow concurrent regeneration

分散出力キャッシュ

デフォルトでは、ストアはインメモリで、インスタンスごとに存在します。複数のサーバーを使う場合は、分散ストア(例:Redis)を基盤にすることで、すべてのインスタンスが同じキャッシュを共有し、無効化できるようにします。

// Register a distributed IOutputCacheStore implementation
// (e.g. a Redis-backed package) so EvictByTag works cluster-wide

理解度チェック

キャッシュの無効化についての理解を確認しましょう。

まとめ

キャッシュポリシーと無効化について学びました。

  • 再利用可能な名前付きポリシーを定義し、名前で適用します。
  • タグでエントリをグループ化し、書き込み時に IOutputCacheStore.EvictByTagAsync でまとめて削除します。
  • 有効期限(自動)と削除(明示的)を組み合わせます。
  • 複数サーバー構成では、分散ストアを使用します。

これでレート制限とキャッシュのコースは完了です。

よくある質問

「キャッシュポリシーと無効化」レッスンは無料ですか?

はい。「キャッシュポリシーと無効化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「キャッシュポリシーと無効化」で何を学びますか?

キャッシュの有効期間とタグを制御します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「キャッシュポリシーと無効化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. レート制限アルゴリズム
  2. レート制限ミドルウェアの設定
  3. 出力キャッシュの基本
  4. キャッシュポリシーと無効化
← C# Academyに戻る