ASP.NETの永続的なファイルシステムディスクキャッシュ

要約:https://www.codeproject.com/articles/12097/cache-management-in-asp-net
異なる用語を使用して、同じ概念、つまりデータの管理を説明します。一部の人々はそれを国家管理と呼び、他の人はそれをキャッシュ管理と呼んでいます。 「キャッシュ」という言葉が好きです。しかし、概念的には、これら2つの間に違いはありません。
次に、ASP.NETのキャッシュ管理(または州管理)のさまざまな側面について説明しましょう。
Windowsアプリケーションではキャッシュ管理は問題ではありませんが、Web環境では常に課題でした。 HTTPはステートレスプロトコルであり、Webサーバーは異なるリクエスト間でユーザーを認識していないため、異なる要求間で特定のユーザーを認識し、データを保存することが非常に重要になり、異なる要求間で再利用できるようにします。 ASP.NETは、クライアント(ブラウザー)とサーバー(Webサーバー)側の両方にデータを保存するための多くの機能を提供しますが、いつ使用するかと混同されることがあります。 ASP.NETでは、セッション、アプリケーション、キャッシュオブジェクトなどの機能に出会いますが、Webアプリケーションで効果的に使用するためにそれらの違いを理解することが重要です。
この記事では、ASP.NETで利用可能なさまざまなキャッシュ管理オプションについて触れます。 Webアプリケーションでは、データストアからの費用のかかるデータ取得操作を回避し、データフォーマットロジックを使用してアプリケーションのパフォーマンスを向上させるだけでなく、ユーザー、アプリケーション、マシン間の後続の要求で同じデータを再利用するために、サーバー側にデータを保存する必要がある場合があります。したがって、これを達成するには、サーバー側にデータを保存(キャッシュ)する必要があります。
キャッシュは、QoSの3つの重要な側面(サービス品質)を達成するのに役立ちます。
ASP.NETは、すべてのユーザーリクエストがアクセスできるデータを保存するアプリケーションオブジェクトと呼ばれるオブジェクトを提供します。このオブジェクトの寿命はアプリケーションに関連付けられており、アプリケーションが開始されるたびに再作成されます。 ASP.NETセッションオブジェクトとは異なり、このオブジェクトはすべてのユーザーリクエストにアクセスできます。このストレージはアプリケーションドメインスペースで作成および維持されるため、これはWebファームシナリオでのデータストレージに使用しないでください。このオプションは、アプリケーションの起動中にアプリケーションオブジェクトにロードできるアプリケーションメタデータ(構成ファイルデータ)のようなデータを保存するのに非常に便利で、ユーザーリクエストごとに毎回リロードせずにアプリケーションの寿命を実行できます。ただし、アプリケーションの実行中に構成ファイルに変更があるときはいつでもキャッシュデータを無効にする必要がある場合、このオプションは、キャッシュされたデータを期限切れにする機能を提供しないため使用すべきではありません。したがって、この場合、ASP.NETキャッシュオブジェクトのような他のオプションを使用する必要があります。これについては以下に説明します。
ASP.NETは、Key -Valueペアオブジェクト - システムで使用できるキャッシュオブジェクトを提供します。Web.CachingNamespace。その範囲はアプリケーションドメインであり、寿命はアプリケーションに関連付けられています。 ASP.NETセッションオブジェクトとは異なり、このオブジェクトはすべてのユーザーリクエストにアクセスできます。
アプリケーションとキャッシュオブジェクトの両方が同じように見えますが、それらの間の重要な違いは、有効期限ポリシーや依存関係などのキャッシュオブジェクトによって提供される追加機能です。つまり、キャッシュオブジェクトに保存されているデータは、アプリケーションコードによって設定された事前定義された時間制限に基づいて、または従属エンティティが変更されたときに、この機能がアプリケーションオブジェクトで使用できないことを意味します。
さまざまな有効期限ポリシーとサポートされている依存関係について説明しましょう。
依存関係とは、依存エンティティが変更されると、アイテムをキャッシュから削除できることを意味します。したがって、依存関係は、キャッシュからの除去が依存関係に依存するアイテムに定義できます。 ASP.NETでサポートされている依存関係には2つのタイプがあります。
例:アプリケーションでは、XMLファイルを使用してエラーの詳細(エラー番号とエラーメッセージマッピング)を保存しているとします。これは、実行時に特定のエラー番号のエラーメッセージを取得するために使用されます。したがって、エラーメッセージが必要なたびにディスクからファイルを読み取る代わりに、アプリケーションスタートアップで一度ロードし、ASP.NETキャッシュに保存するためにさらに使用することにしました。したがって、アプリケーションの実行中に新しいエラーメッセージを追加するか、既存のエラーメッセージの一部を変更するために構成ファイルを変更する必要がある場合、キャッシュされたデータはどうなりますか?アプリケーションのファイルの変更を反映するために、アプリケーションを停止して再度開始する必要がありますか?答えはノーです。ファイル依存関係オプションを使用してファイルが変更されるたびに、キャッシュデータを無効にすることができます。
有効期限ポリシーは、キャッシュ内のアイテムが期限切れになる方法と時期のポリシーを設定します。
.NETリモートシングルトンオブジェクトは、複数のクライアントと同じインスタンスを共有するため、Singletonオブジェクトを使用して、異なるクライアントの呼び出し間でデータを保存および共有できます。 .NETリモートはプロセスとマシンの外で使用できるため、このオプションは、特にWebファームシナリオでサーバーとユーザー間でデータをキャッシュして共有する場合に非常に便利です。このアプローチでは、Singletonリモートオブジェクトのメンバー変数としてデータを保存し、データを読み取りおよび保存する方法を提供できます。しかし、これを実装している間、キャッシュとして使用されるリモートオブジェクトがガベージコレクターによって破壊されないようにする必要があります。そのためには、リモートキャッシュオブジェクトのリース期間を無限に設定する必要があります。そうすれば、リース期間が決して時にかけられないようにします。 MarshalbyRefobjectのInitializElifetimeServiceメソッドをオーバーライドし、この方法からNULLを返すことにより、それを行うことができます。しかし、このアプローチの唯一の問題はパフォーマンスです。分析が示すように、他のアプローチと比較すると、このアプローチではパフォーマンスが非常に低くなります。とにかく、さまざまなオプションを分析し、要件に合った最適なオプションを使用するのはアプリケーションデザイナー/開発者次第です。
メモリマップされたファイルとは何かを知っています。基本的に、アプリケーションのプロセスアドレス空間内の特定のアドレスの範囲にディスク上のファイルをマッピングすることです。このオプションにより、さまざまなプロセスがアプリケーションのパフォーマンスを向上させることにより、同じデータを使用できます。メモリマップファイルを使用することは.NET開発者の間ではあまり人気がないため、これを実装することには多くの複雑さが含まれ、.NETフレームワークがこれをサポートしていないため、このアプローチは個人的には提案しません。しかし、誰かがこのアプローチを使用することに非常に興味がある場合、彼らは独自の要件に従って独自のカスタムソリューションを開発する必要があります。
データまたはオブジェクトをグローバルに保存するために静的変数を使用して、アプリケーションの存続期間中にアクセスできるようにします。同様に、ASP.NETでは、キャッシュデータに静的オブジェクトを使用でき、データを取得してキャッシュに保存する方法を提供することもできます。静的変数はプロセス領域に保存されるため、パフォーマンスの面では高速です。しかし、静的変数の場合に有効期限ポリシーと依存関係を実装することは非常に困難であるため、一般にこのオプションよりもASP.NETキャッシュオブジェクトを好みます。別の問題は、カスタム静的キャッシュオブジェクトがスレッドセーフである必要があり、慎重に実装する必要があることです。
データベースを使用して、データを保存し、ユーザーとマシン間でデータを共有することもできます。このアプローチは、大量のデータをキャッシュする場合に非常に便利です。少量のデータを保存するためにこのアプローチを使用することは、パフォーマンスのために良い考えではありません。少量のデータを保存するには、他のASP.NETインプロセスキャッシングメカニズムを使用する必要があります。データをデータベースに保存する必要があるため、すべてのオブジェクトをXMLシリアル化して、保存して取得しやすくする必要があります。また、.NETフレームワークで利用できる他のタイプのシリアル化形式を使用することもできます。
アプリケーションでは、一部のページでは、通常、出力が特定の期間変化しない場合があります。たとえば、HRのウェブサイトでは、従業員の給与の詳細はあまり頻繁に変更されず、1か月に1回だけ変更されます。一般的に、それは毎月1日のみに変化します。そのため、1か月間、給与の詳細ページには、特定の従業員についても同じ詳細が表示されます。したがって、この場合、ビジネスの計算処理を避けるためにサーバーのどこかにページをキャッシュすることをお勧めします。私の意見では、はい!とても良い考えです。これを達成するために、ASP.NETは、特定の期間、サーバー内のページの出力を保存する機能を提供します。また、ページフラグメントキャッシングと呼ばれるページのフラグメントを保存する機能も提供します。
アプリケーションのパフォーマンスを改善するために、クライアント側のデータまたはページをキャッシュする必要がある場合があります。このメカニズムを使用すると、サーバー上の負荷が減少しますが、このメカニズムには、クライアント側のデータをキャッシュする際にいくつかのセキュリティの問題があります。
Cookieは、リクエストごとにサーバーに送信され、サーバーからの応答として受信されるクライアント側のストレージです。規模の制限のため、少量のデータを保存するために使用する必要があります。有効期限ポリシーは、一定の期間後にアイテムを無効にするためにCookieが設定できます。
ASP.NET ViewStateは、ページとコントロールに関連するデータが生成されたページ(クライアント側)に保存されるWebForms(MVCではなく)のみの概念です。サーバーへの複数の要求にわたって値を保持します。 ViewStateは、ASP.NETの暗号化された非表示フィールドとして内部的に実装されています。 ViewStateは、要求ごとにサーバーに渡されるため、大量のデータを保存するために使用しないでください。
隠されたフィールドは、ページ内の他のコントロールに似ていますが、このコントロールの目に見える状態は常に間違っています。 ViewStateのように、大量のデータを保存するために使用しないでください。非表示のフレームは、クライアント側のデータをキャッシュするために使用できますが、隠されたフレームはすべてのインターネットブラウザーによってサポートされていないことに注意してください。
インターネットブラウザは、クライアント側のページをキャッシュするためのキャッシュメカニズムを提供します。これは、ページのヘッダーに追加されたexpiresディレクティブを使用して、またはWebサーバーに手動で設定することで設定できます。このオプションを使用して、クライアント側の静的ページ、スクリプト、CSS、画像をキャッシュする必要があります。
ハビエル・カニョンが❤§で作られています。