web-dev-qa-db-ja.com

キャッシュとセッションの利点

セッションとキャッシュにデータテーブルを保存することの違いは何ですか?長所と短所は何ですか?

そのため、データテーブルに結果を返し、それをグリッドビューにバインドする単純な検索ページの場合。ユーザー 'a'が検索し、ユーザー 'b'が検索する場合、各ユーザーが異なる結果を持っている可能性が高いため、セッションに保存する方が良いでしょうか、それともキャッシュに各検索を保存できますか? 1つのキャッシュのみ。基本的に私が言いたいのは、キャッシュが上書きされるということです。

66
Xaisoft

重要な違いの1つは、指定された時間が経過すると、キャッシュ内のアイテムが期限切れになる(キャッシュから削除される)ことです。セッションに入れられたアイテムは、セッションが終了するまでそこに残ります。

ASP.NETは、使用可能なメモリの量が少なくなったときに、キャッシュからアイテムを削除することもできます。

もう1つの違い:セッション状態は外部(状態サーバー、SQLサーバー)に保ち、Webアプリの複数のインスタンス間で共有できます(負荷分散のため)。これはキャッシュには当てはまりません。

これらの違いに加えて(他の人が述べているように):セッションはユーザー/セッションごとであり、キャッシュはアプリケーションごとです。

82
M4N

知る限り、重要な違いはセッションはユーザーごとであるのに対して、キャッシュはアプリケーションスコープのアイテム用です。

他の回答で述べたように、ユーザーごとの情報をキャッシュに保存でき、キーを提供します(セッションまたはCookieのいずれかで)。その後、キャッシュ内のアイテムを期限切れにしたり、それらのアイテムに依存関係を設定したりするための制御が強化されます。したがって、問題のDataTableが定期的に変更される場合は、おそらくキャッシュが適切なオプションです。それ以外の場合、静的セッションの場合はより適切な場合があります。 Steven Smithのdnrtvでのキャッシュに関する優れたビデオ これはチェックする価値があります。

それは、あなたが何を達成しようとしているか、どれだけの時間を持っているかに本当に依存します。アプリケーションに状態を保存する方法に関して、考慮すべき他の方法がいくつかあります。テーブルの大きさに応じて、Cookieに状態を保存することを検討できます(機密情報の場合は暗号化されます)。あるいは、アプリケーションスコープデータの場合、ページまたはクラスの静的フィールドを使用します。 Applicationオブジェクトもあります。

Update:あなたが自問しなければならない重要な質問は、誰がこのデータを見るべきかだと思います。

Are they going to access the data frequently?  

(いいえ、気にしません)。

Is it going to change?  

(いいえ、静的フィールドまたはアプリケーションを使用します)。

Is it acceptable for user a and user b to see the same results?  

(いいえ、ユーザー名と検索語で構成されるキーでキャッシュを使用します。).
(はい、検索用語のキーを使用してキャッシュを使用します)。

正直なところ、もしあなたが開発にそれほど遠くないのであれば、キャッシュ/状態の問題を後日保留にすることを検討します-あなたはそれを必要としないかもしれません。

パフォーマンスチューニングの最初の3つのルールは次のとおりです。1.測定、2。さらに測定します。 3.もう一度測定...

28
Martin Clarke

別の重要な違いセッション状態はブロックされます非同期のAjaxリクエストが同時に実行されると、パフォーマンスに影響します

11
Nabeel

キャッシュは、データが取得される回数を減らすことを目的として、アプリケーションスコープに含まれています。セッションは、特定のユーザー状態を提供する目的で、ユーザーのセッションスコープ内にあります。

5
Greg Ogle

まあそれは、ASP.NET用にセッションを構成する方法に依存します。セッションをデータベースまたはメモリに保存していますか?メモリ内で別のサーバーを使用している場合、または現在のWebサーバーをセッションに使用していますか?

どのように設定されているかにもよりますが、大量のデータを保存している可能性があることを教えてくれるデータテーブルのようなものを使用している場合、パフォーマンスに影響する可能性があります。

また、セッションはユーザーごとに保存され、Cookieを受け入れず、ASP.NETをCookieなしモードに設定している場合、セッションCookieまたはURLに保存されたセッションチケットによってユーザーごとに取得されます。キャッシュしたものはすべてアプリケーションレベルでキャッシュされ、必要な場合とそうでない場合があるすべてのユーザーセッションで使用できます。

5
Andrew Hare

セッションはユーザーごと、キャッシュはアプリケーション用です。

キャッシュ内のアイテムは、有効期限(スライドまたは固定)およびIISワーカープロセスのメモリ制限に基づいて自動的に削除できます。

したがって、基本的にキャッシュ内のアイテムは存在することが保証されませんが、セッションはセッションが終了するまでそこに留まります。

(セッションまたはCacheの創造的な使用を介して)ユーザーごとにアイテムを保存すると、メモリを大量に使用する可能性があるため、慎重に検討する必要があります。

これに加えて、IIS=がワーカープロセスをリセットすると、キャッシュとセッションが失われる可能性があります。

4
Greg

この回答 を参照してください。

Memcachedやvelocityなどのバックエンドプロバイダーを使用しない限り、セッションはアプリのパフォーマンスを低下させる可能性があります。一般的には避けるべきです。

2
StingyJack