web-dev-qa-db-ja.com

さまざまなASP.NETキャッシュオプションの長所/短所

最近、ASP.NET MVC WebAPIアプリケーションでアプリケーションデータをキャッシュすることについて質問したところ、新しい質問がありました。 ASP.NETで利用できるさまざまなキャッシュ方法の長所と短所は何ですか?

私は出くわしました:

  • メモリキャッシュ

    http://msdn.Microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

  • 静的メンバー変数の使用:

    private static Northwind.SuppliersDataTable suppliers = null;
    
  • アプリケーションの状態:

     HttpContext.Current.Application["key"] ="Value"
    
  • データキャッシュ:

    HttpRuntime.Cache.Insert(
      /* key */                "key", 
      /* value */              "value", 
      /* dependencies */       null, 
      /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
      /* slidingExpiration */  Cache.NoSlidingExpiration, 
      /* priority */           CacheItemPriority.NotRemovable, 
      /* onRemoveCallback */   null);
    

他にもあると確信しており、それらはすべて技術的にデータをメモリに保存していることを知っています... ASP.NET MVC webapiに何を使うべきか考えていますか?

私の前の質問: メモリ内のアプリケーションデータのキャッシュ:MVC Web API

55
vesuvious

各キャッシングテクノロジー/メソッドには、独自の機能セットがあります。これらの機能は、あるアプリケーション要件では不利に思えるかもしれませんが、他のアプリケーション要件では有利になる場合があります。

つまり、要するに、要件に応じて、どのキャッシングテクノロジーとどの機能が最適かを決定します。

For example, Let us discuss some client side Caching techniques

MSDNは、HiddenFieldを使用して、頻繁に変更される少量のデータのみを非表示フィールドに保存できると述べています。このデータは、ポストバックごとにサーバーへのラウンドトリップに含まれるからです。

この機能の利点:クライアント側オプションを使用してページ情報を保存することにより、サーバーの負荷を軽減。

ただし、MSDNは次のように明確に述べています。このアプローチには最小限のセキュリティサポートしかありません。

したがって、セキュリティ上の考慮事項もあるため、この機能を常に使用する場合と使用しない場合があります。

Consider one more examplePage Output caching:ページ出力キャッシュとページフラグメントキャッシュの2種類です。

ページ出力キャッシュは、Webページ全体をキャッシュし、そのページのコンテンツがかなり静的な場合にのみ適しています。ページの一部が変更されている場合は、静的セクションをユーザーコントロールとしてラップし、ページフラグメントキャッシュを使用してユーザーコントロールをキャッシュできます。

And one last comment onApplication vs HttpRuntime.cache

Applicationはキャッシュではなく、グローバルな名前付き値のコレクションです。 Applicationにオブジェクトを追加すると、appdomainがリサイクルされるまでオブジェクトは残ります。

  • アプリケーション変数は、Webアプリケーションのすべてのユーザー間で共有される変数です
  • アプリケーション変数は静的変数のように動作し、静的変数はWebアプリケーションではステートレスなので静的変数の代わりになります
  • 共有値のみがアプリケーション変数に保持され、使用されなくなったらすぐに明示的に削除する必要があります。

CacheApplicationまたはCacheクラスのいずれかで頻繁に要求されるオブジェクトとデータをキャッシュすることにより、ASP.NETアプリケーションのパフォーマンスを大幅に向上させることができます。 Cacheクラスは、はるかに高い柔軟性と制御を提供しますが、キャッシングに関してApplicationクラスよりもスループットが向上するという点で、わずかな利点しかありません。 Cacheクラスの組み込みの潜在的な利点を正確に測定できるテストスキームを開発するのは非常に困難です。特徴。この場合、開発者は決定を下す必要があり、プロジェクトのニーズと利便性、およびその使用パターンに基づいている必要があります。詳細については、このリンクを確認してください。

すべてのキャッシュテクノロジーに関する完全な説明については、このMSDN記事を参照してください。 Asp.netで、各テクノロジーの機能について議論しました。

また、これらの2つのリンクは、開始するのに最適なソースです。

34
R.C

MemoryCache対ASP.NETキャッシュについて:非常によく似た機能を提供します。 ASP.NET 4アプリケーションでは、他の理由がない限り、ASP.NETキャッシュを一般的に好むでしょう。それは、 。NET 4のバグ のためです。 。

静的フィールドは、有効期限ポリシーを必要としない共有データを保存するのに適しています。

アプリケーションの状態は、従来のASPと互換性のあるロックセマンティクスを備えた静的辞書以上のものではありません。従来のASPコードとの下位互換性のためにのみ使用します。

10
Joe

Web APIを使用する場合、キャッシングの最初の選択肢は常にHTTP応答にキャッシングヘッダーを設定することです。 HttpResponseMessage.CacheControlHeader

最後のオプションは、HttpContextまたはHttpRuntimeに依存するものである必要があります。これにより、特定のホストに結び付けられます。 Web APIアプリケーションは、ホストから独立して構築する必要があります。

4
Darrel Miller