ASP.NET Web ページ (Razor) サイトのパフォーマンスを向上させるためにデータをキャッシュする
作成者: Tom FitzMacken
この記事では、ヘルパーを使用して、ASP.NET Web ページ (Razor) Web サイトのパフォーマンスを向上させるために情報をキャッシュする方法について説明します。 通常は取得または処理にかなりの時間がかかり、頻繁に変更されないデータの結果を保存 (つまりキャッシュ) することで、Web サイトを高速化できます。
学習内容:
- キャッシュを使用して Web サイトの応答性を向上させる方法。
この記事で紹介する ASP.NET 機能は次のとおりです。
WebCache
ヘルパー。チュートリアルで使用するソフトウェアのバージョン
- ASP.NET Web ページ (Razor) 3
このチュートリアルは、ASP.NET Web ページ 2 にも適用できます。
ユーザーがサイトからページを要求するたびに、Web サーバーは要求を満たすために何らかの作業を行う必要があります。 一部のページでは、データベースからデータを取得するなどの、(比較的) 時間がかかるタスクをサーバーが実行する必要がある場合があります。 これらのタスクがそれ自体では長くかからない場合でも、サイトで大量のトラフィックが発生した場合、Web サーバーに複雑または低速なタスクを実行させる一連の個々の要求を合計すると、大量の作業になる可能性があります。 これは最終的にサイトのパフォーマンスに影響を与える可能性があります。
このような状況で Web サイトのパフォーマンスを向上させる 1 つの方法は、データをキャッシュすることです。 サイトが同じ情報に対して繰り返し要求を受け取り、ユーザーごとに情報を変更する必要がなく、時間の影響を受けない場合は、再フェッチや再計算をせずに、データを 1 回フェッチしてその結果を保存できます。 次にその情報に対する要求を受け取ったときは、キャッシュから取得するだけです。
一般に、頻繁に変更されない情報をキャッシュします。 キャッシュに情報を格納すると、Web サーバー上のメモリに保存されます。 キャッシュする期間は、秒単位から数日まで指定できます。 キャッシュ期間が経過すると、情報はキャッシュから自動的に削除されます。
Note
キャッシュ内のエントリは、有効期限が切れた以外の理由で削除される可能性があります。 たとえば、Web サーバーが一時的にメモリ不足になる可能性があります。メモリを再利用する 1 つの方法は、キャッシュからエントリを放棄することです。 後で説明するとおり、キャッシュに情報を格納した場合でも、必要なときには、まだ存在することを確認する必要があります。
Web サイトに現在の気温と天気予報を表示するページがあるとします。 この種類の情報を取得するには、外部サービスに要求を送信します。 この情報はあまり (たとえば、2 時間以内には) 変わらず、外部呼び出しは時間と帯域幅を必要とするため、キャッシュの候補として適しています。
ページにキャッシュを追加する
ASP.NET には、サイトにキャッシュを追加し、キャッシュにデータを追加しやすくする WebCache
ヘルパーが含まれています。 この手順では、現在の時刻をキャッシュするページを作成します。 現在の時刻は頻繁に変化するものであり、さらに計算が複雑ではないので、これは実際の例ではありません。 ただし、動作するキャッシュを示すのに適した方法です。
WebCache.cshtml という名前の新しいページを Web サイトに追加します。
次のコードとマークアップをそのページに追加します。
@{ var cacheItemKey = "CachedTime"; var cacheHit = true; var time = WebCache.Get(cacheItemKey); if (time == null) { cacheHit = false; } if (cacheHit == false) { time = @DateTime.Now; WebCache.Set(cacheItemKey, time, 1, false); } } <!DOCTYPE html> <html> <head> <title>WebCache Helper Sample</title> </head> <body> <div> @if (cacheHit) { @:Found the time data in the cache. } else { @:Did not find the time data in the cache. } </div> <div> This page was cached at @time. </div> </body> </html>
データをキャッシュするときは、Web サイト全体で一意の名前を使用してキャッシュに格納します。 この場合は、
CachedTime
という名前のキャッシュ エントリを使用します。 これは、コード例に示すcacheItemKey
です。コードはまず
CachedTime
キャッシュ エントリを読み取ります。 値が返された場合 (つまり、キャッシュ エントリが null でない場合)、コードは time 変数の値をキャッシュのデータに設定するだけです。ただし、キャッシュ エントリが存在しない場合 (つまり null)、コードは時刻値を設定し、それをキャッシュに追加して、有効期限の値を 1 分に設定します。 1 分後、キャッシュ エントリは破棄されます。 (キャッシュ内の項目の既定の有効期限の値は 20 分です)。コマンド
WebCache.Set(cacheItemKey, time, 1, false)
は、現在の時刻値をキャッシュに追加し、その有効期限を 1 分に設定する方法を示しています。 slidingExpiration パラメーターをfalse
に設定すると、要求されるたびに有効期限が更新されることはありません。 有効期限が切れるのは、キャッシュに最初に追加されてから厳密に 1 分後です。 この値をtrue
に設定すると、値がキャッシュから要求されるたびに 1 分間の有効期限がリセットされます。このコードは、データをキャッシュするときに常に使用する必要があるパターンを示しています。 キャッシュから何かを取得する前に、まず
WebCache.Get
メソッドが null を返したかどうかを常に確認します。 キャッシュ エントリの有効期限が切れているか、何らかの理由で削除された可能性があるため、特定のエントリがキャッシュに含まれると保証されることは決してありません。ブラウザーで WebCache.cshtml を実行します。 (実行する前に、ファイル ワークスペース内でこのページが選択されていることを確認してください)。ページを初めて要求するとき、時刻データはキャッシュに含まれていないので、コードは時刻値をキャッシュに追加する必要があります。
ブラウザーで WebCache.cshtml を更新します。 今回は、時刻データがキャッシュにあります。 最後にページを表示してから時刻が変わっていないことに注意してください。
キャッシュが空になるまで 1 分間待ってから、ページを更新します。 このページは再度、キャッシュに時刻データが見つからなかったことを示し、更新された時刻がキャッシュに追加されます。
その他のリソース
- グラフでデータを表示する
- WebCache API リファレンス (MSDN)