.NET TIPS [ASP.NET]キャッシュ破棄のタイミングを指定するには?山田 祥寛2004/09/03 |
|
|
「TIPS:データセットをキャッシングするには?」でも紹介したように、Cacheオブジェクトを利用することで任意のデータをメモリ上にキャッシングすることができる。一般的に、データ・キャッシングの手法は、更新頻度が少なく、かつ参照頻度の多いデータに対して利用することで高いパフォーマンスへの改善の効果を望める。
ところで、先のTIPSの内容で疑問に思われたことはないだろうか。アプリケーション共通でアクセスできるデータをメモリ上に保持しておきたいだけならば、Applicationオブジェクトや静的メンバを使用すればよいのではないか(詳細は、別稿「TIPS:アプリケーション全体で共有するデータを扱うには?(静的メンバ編)」、「TIPS:アプリケーション全体で共有するデータを扱うには?(Applicationオブジェクト編)」を参照)。なぜ、Applicationオブジェクトや静的メンバを使わずに、あえてCacheオブジェクトを利用する必要があるのだろうか。
答えは簡単だ。Cacheオブジェクトでは、データの保持期間を絶対/相対時間や任意のファイルへの依存関係によって管理することができる。つまり、ある一定時間が経過したタイミングで、あるいは、指定されたファイルが変更されたタイミングなどで、Cacheオブジェクトに格納したデータを自動的に破棄/更新することが可能となるのだ。これは、静的メンバやApplicationオブジェクトでは実現できない機能だ。
Cacheクラスには、キャッシュの破棄/更新タイミングを管理するために、依存関係ポリシー、有効期限ポリシーといった「ポリシー」が用意されている。本稿では、これら個々の管理ポリシーについて、別稿「TIPS:データセットをキャッシングするには?」で示したサンプル・プログラム「cache_vb.aspx」を書き換える形で見ていくことにする。
有効期限ポリシー
有効期限ポリシーは、その名のとおり、時間単位でキャッシュの破棄タイミングを決定する管理ポリシーだ。キャッシュ・データが破棄されるタイミングを絶対時間(何時何分にキャッシュを破棄するか)、または相対時間(キャッシュへのアクセスがなくなってから何分後にキャッシュを破棄するか)のいずれかで指定することができる。
例えば、別稿のcache_vb.aspxでキャッシュ・データ“Books”を現在時刻の5分後に破棄したいとしたら、以下のように記述することができる(Insertメソッドの詳細についてはMSDNライブラリの「Cache.Insert メソッド (String, Object, CacheDependency, DateTime, TimeSpan)」を参照してほしい)。
Cache.Insert("Books", objDs, Nothing, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration) |
Cache.NoSlidingExpirationフィールドは、相対時間によるポリシーが無効であることを表す定数値だ。TimeSpan.Zeroと指定しても同じ意味となる。
「DateTime.Now.AddMinutes(x)」は、現在時刻を起点としてx分後の時刻を表すDateTimeオブジェクト(System名前空間)を生成する。AddMinutesメソッドのほかに、AddMonths(月)、AddDays(日)、AddHours(時)、AddSeconds(秒)、AddMilliseconds(ミリ秒)などを使用することも可能だ。
次に、相対時刻で管理ポリシーを設定してみよう。以下の例では、キャッシュ・データへのアクセスがなくなってから30秒が経過したら、該当するキャッシュは破棄される。
Cache.Insert("Books", objDs, Nothing, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(30)) |
Cache.NoAbsoluteExpirationフィールドは、絶対時間によるポリシーが無効であることを表す定数値だ。DateTime.MaxValueと指定しても同じ意味となる。
「TimeSpan.FromSeconds(x)」は、x秒の時間を表すTimeSpanオブジェクトを生成する。FromSecondsメソッドのほかに、FromDays(日)、FromHours(時)、FromMinutes(分)、FromMilliseconds(ミリ秒)などを指定することも可能だ。ただし、負の時間や、1年を超える時間を指定することはできないので、注意すること。
なお、絶対時間と相対時間を同時に指定することはできない。
依存関係ポリシー
依存関係ポリシーは、任意のファイル、または異なるキャッシュ・キーが変更されたタイミングで、キャッシュ・データを破棄/更新するための管理ポリシーだ。依存関係ポリシーの指定には、Cache.Insertメソッドの第3パラメータにCacheDependencyオブジェクト(System.Web.Caching名前空間)を指定する必要がある。
例えば、books.xmlの内容が変更されたタイミングで、キャッシュ・データを破棄したい場合には、以下のように指定すればよい。
Dim objCd As New CacheDependency(Server.MapPath("books.xml")) |
これによって、データ・キャッシングの効果は得ながらにして、元データの変更をリアルタイムに反映できるようになる。
そのほかCacheDependencyクラスでは、複数のファイルやフォルダ、複数のキャッシュ・キー、別のCacheDependencyオブジェクトに対して依存関係を持たせることも可能だ。これを利用することで、例えば、キャッシュ・データとして「部門データ」と「部員データ」を保持していた場合に、部門データのリフレッシュに伴って部員データもリフレッシュするというような階層を持ったキャッシュ管理も可能になるだろう。
以下には、CacheDependencyクラスのコンストラクタの一覧を示しておくことにする。適宜、状況に応じて使い分けていただきたい。
|
|
CacheDependencyクラスのコンストラクタの一覧 | |
filePath:依存するファイル名(またはその配列) |
なお、もしもキャッシュを生成する際にfilePathで指定されたパスが見つからず、後から該当のファイルが新規に作成された場合にも、CacheDependencyクラスはファイルが「変更された」と見なし、キャッシュ・データは破棄されるので注意すること。
カテゴリ:Webフォーム 処理対象:キャッシング 使用キーワード:Cacheオブジェクト 使用ライブラリ:Cacheクラス(System.Web.Caching名前空間) 使用ライブラリ:CacheDependencyクラス(System.Web.Caching名前空間) 使用ライブラリ:DateTime構造体(System名前空間) 関連TIPS:データセットをキャッシングするには? 関連TIPS:アプリケーション全体で共有するデータを扱うには?(静的メンバ編) 関連TIPS:アプリケーション全体で共有するデータを扱うには?(Applicationオブジェクト編) |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|