asp.net-mvcでのキャッシュ


82

データベースの負荷の高いアクションをasp.net-mvcサイトにキャッシュしたいと思います。私の研究で私は見つけました

しかし、私はまだそれを理解しているとは感じていません。
いくつかのパーに応じてPOSTリクエストをキャッシュできるようにしたい。これらのパーはオブジェクト内にあります。したがって、次のリクエストの結果をキャッシュしたいと思います。

public ActionResult AdvancedSearch(SearchBag searchBag)

ここで、searchBagは、オプションの検索パラメーターの(束)を保持するオブジェクトです。私のビュー自体は(そうあるべきですが)軽いですが、検索バッグに入力されているフィールドによっては、データアクセスにかなり時間がかかる場合があります。

アクションではなく、データレイヤーにキャッシュする必要があると感じています。
OutputCache属性でVaryByParamをどのように使用する必要がありますか?


2
VaryByParam = "searchBag.property"で試しましたか?
エドゥアルドCampañó

いいえ、していません。あなたの言うことを試してみます。しかし、いくつかのパラメーターを列挙するのはどうですか?
Boris Callens

2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa 2009年

1
少し遅れていますが、Enterprise Library Caching ApplicationBlockは.Net4.0に含まれているため、System.Runtime.CachingのMemoryCacheを使用して同様の効果を得ることができます。どこでも:)
カール

回答:


74

モデルまたはデータレイヤーにもキャッシュするのが好きです。これにより、コントローラー/プレゼンテーションからのデータの取得に関連するすべてが分離されます。System.Web.HttpContext.Current.CacheエンタープライズライブラリからASP.NETキャッシュにアクセスするか、エンタープライズライブラリからキャッシュアプ​​リケーションブロックを使用できます。クエリのパラメータから、キャッシュされたデータのキーを作成します。データを更新するときは、必ずキャッシュを無効にしてください。


1
エンタープライズライブラリを読む必要があると思います。遅延のほとんどはデータレイヤーにあるので、最終的にはそれが最善の解決策になると思います。現在は読み取り専用のDBであるため、これにより古いオブジェクトの問題が軽減されます:)
Boris Callens

17
キャッシングアプリのブロックは、やり過ぎのようです。ほとんどすべてのインスタンスで、HttpRuntime.Cacheが十分すぎることがわかりました。
Jeff Putz

3
なぜやり過ぎ?私は今、開発をさらに進めており、ELのキャッシュシステムは本当に使いやすいことがわかりました。正しいライブラリを参照し、正しい設定行を追加すると、それぞれ1行のコードでオブジェクトのキャッシュと取得を開始できます。
Boris Callens

6
一部の人を苛立たせるのは「正しい設定行を追加する」ステップだと思います。
マイクチェンバレン

データベースに更新があるときにメモリキャッシュを無効にする方法も説明できればよいでしょう。サービスを使用して頻繁にチェックし、次にキャッシュをクリアする方法を教えてください。
shaijut 2016年

66

または、HttpContext.Currentから独立して、HttpRuntime.Cacheからキャッシュにアクセスすることもできます:)


これは、コードがバックグラウンドスレッドで実行されているとき(つまり、async / await goodness)でも、「キャッシュ」にアクセスできることも意味します。
Michael K. Campbell

12

多くの場合、OutputCachingは最も高速で効率的ですが、要件を満たしている場合に限ります。それが間違っているなら、速く効率的にすることには意味がありません!;)

この場合、複雑なキャッシュのニーズがあるため、データレイヤーでのキャッシュは正しいように思われます。キャッシュされる出力を制御するパラメータのセットが単純な場合は、2つを組み合わせることができる場合があります。


0

このような出力キャッシュを使用できます

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

または、キャッシュプロファイルを使用してWeb構成で設定することもできます

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.