ASP.Netでのキャッシュのベストプラクティス

キャッシングは、システム内のリソースの消費を最小限に抑えることでアプリケーションのパフォーマンスを向上させるためにASP.Netでよく採用される状態管理戦略です。適切に使用すると、wWbページの全体または一部を保存したり、HTTPリクエスト全体でアプリケーションのデータを保存したりすることで、アプリケーションのパフォーマンスを大幅に向上させることができます。キャッシングにより、Webページをより高速にレンダリングでき、キャッシングを適切に使用することで、データベースへのヒットやサーバーのリソースの消費を最小限に抑えるか減らすことができます。

ASP.Netでのキャッシュには、次の3つのタイプがあります。

  1. ページ出力キャッシュ
  2. ページフラグメントのキャッシュ
  3. データキャッシング

ページ出力キャッシュ

これはASP.Netのキャッシュの形式であり、Webページのコピーをメモリキャッシュに格納して、同じWebページに対する後続の要求をキャッシュから直接フェッチできるようにします。キャッシュされた出力はアプリケーションに送信されます。これにより、アプリケーションのパフォーマンスが大幅に向上します。次のコードスニペットは、ページ出力キャッシュを実装する方法を示しています。

VaryByParamオプションは、新しいキャッシュエントリを必要とするHttpリクエストの変数を指定するのに役立ちます。その他の可能なオプションには、VaryByHeaderおよびVaryByCustomが含まれます。OutputCacheディレクティブで場所と期間を指定することもできます。これらを使用して、キャッシュの場所と、Webページをキャッシュする期間をそれぞれ指定できます。

ページフラグメントのキャッシュ

ページフラグメントキャッシュは、Webページが部分的にキャッシュされるキャッシュ戦略です。Webページ全体ではなく、Webページのフラグメントのみがキャッシュされます。ページ出力キャッシュと同じ構文を使用できます。ただし、WebページではなくユーザーコントロールにOutputCache属性を適用する必要があります。フラグメントキャッシュは、Webページの一部のみをキャッシュする必要がある場合に役立ちます。通常、Webページに共通セクションと動的セクションが混在している場合です。例として、メニュー項目の組み合わせと、データベースから頻繁に入力および更新する必要がある特定の動的セクションを含むWebページを作成できます。

データキャッシング

ASP.Netは、後で取得できるようにデータをキャッシュに保存するためのキャッシュAPIを公開しています。キャッシュAPIを使用してデータをキャッシュに保存するための構文を以下に示します。

Cache["key"] = "value";

AddメソッドまたはInsertメソッドを使用することもできます。キャッシュからエントリをリモートするには、CacheクラスのRemove()メソッドを使用できます。CacheクラスのInsert()メソッドを使用すると、キャッシュの依存関係を指定できます。キャッシュの依存関係は、(キャッシュが入力された)データストア内のデータが変更されたときに、キャッシュがすぐに再入力されることを保証する戦略です。データストア内のデータが変更されると、キャッシュが期限切れになり、キャッシュに最新のデータが再入力されます。これについて詳しくは、このMSDNの記事を参照してください。

ベストプラクティス

できるだけ頻繁にキャッシュし、アプリケーションのすべてのレイヤーでデータを適切にキャッシュする必要があります。データキャッシュを使用する場合は、キャッシュ内のデータがデータストア内のデータと同期するように適切な戦略を実装する必要があります。 Memcachedのような分散キャッシュマネージャーを利用して、キャッシュ戦略を適切に拡張し、パフォーマンスを大幅に向上させることができます。Memcachedを使用して大きなデータを保存できます。比較的古いデータのみをキャッシュするようにする必要があります。時間の経過とともに頻繁に変更されるデータをキャッシュする意味はありません。また、再利用される可能性が低いデータは、キャッシュに保存しないでください。 SqlDependencyまたはSqlCacheDependencyを使いすぎないでください。

そして今、キャッシュの欠点も教えてください。キャッシュオブジェクトは、現在のアプリケーションドメインでのみ使用できます。したがって、データをキャッシュに保存し、Webファーム全体でアクセスできるようにする場合、それは不可能です。キャッシュ内のデータにWebファームでグローバルにアクセスできるようにするには、Windows Server AppFabricCachingやその他の分散キャッシュフレームワークなどの分散キャッシュを活用する必要があります。

キャッシングは、比較的古いデータをメモリに保存することでアプリケーションのパフォーマンスを向上させる強力なメカニズムであり、後で同じデータをキャッシュメモリから取得できます。このトピックについては、今後の投稿で実際のコード例を使用して詳しく説明します。