連載
Enterprise Library概説

Windowsアプリケーションに高機能なキャッシュ機能を実装しよう

―― ASP.NETキャッシュより多機能なキャッシュ機能を提供する「Caching Application Block」 ――

アバナード株式会社 市川 龍太(patterns & practices Champion
2006/10/14
Page1 Page2

 前回では、Cryptography Application Blockを使った暗号機能について解説した。

 今回はWindowsアプリケーション(以下Winアプリ)にASP.NET Webアプリケーション(以下Webアプリ)と同等のキャッシュ機能を提供するCaching Application Block(以下CachingAB)について解説する。

 なお、今回解説するCachingABはEntLib 1.1版と比べて機能的な差異はほとんどないため、本稿の内容はEntLib 2.0以前のバージョンでも適用可能である(なおEntLibは「Enterprise Library」の略)。

ASP.NETが提供するキャッシュ機能

 ASP.NETにはデフォルトで「ASP.NETキャッシュ」と呼ばれるインメモリ・キャッシュ機能が提供されており、System.Web.HTTPContext.Cache名前空間のクラスを通して利用することが可能である。このキャッシュ機能を利用することで、キャッシュ領域にデータの格納や取得を簡単に行うことが可能になっている。

 もちろん単にデータを格納・取得するだけであれば何もわざわざキャッシュ機能を使わなくても、Applicationオブジェクトや静的変数(C#はstatic、Visual BasicはSharedというキーワード)を利用することで同様の処理を実現できるわけだが、キャッシュ機能を利用した場合は、例えば以下のような要件に対して柔軟かつ簡単に対応できるというメリットがある。

■メモリ消費量に応じてキャッシュ・データを破棄する

 メモリ消費量が設定したメモリ制限の20%未満になると、ASP.NETキャッシュはLRUルール(Least-Recently Usedルール:最も長時間使用されなかったデータから削除されるというルール)と、キャッシュ・データに割り当てられたCacheItemPriority列挙体の値(AboveNormal、BelowNormal、High、Low、Normal、NotRemovable)に基づいて、キャッシュ・データが自動的に破棄される。これによってメモリ・リソースが効率的に利用されるようになっているのである。

 ちなみにメモリ制限の設定は、次の例のようにMachine.configファイルで設定することが可能である。

<processModel memoryLimit="50">
Machine.configファイルでのメモリ制限の設定例
この例の場合だとワーカー・プロセスに物理メモリの50%までというメモリ制限をかけることになる。つまりサーバに2Gbytesのメモリが実装されている場合であれば、メモリ消費量が1Gbytesを超えるとプロセスがリサイクル(=リクエスト数やメモリ使用量によってワーカー・プロセスをリフレッシュすること)されることになる。

■任意の時間に応じてキャッシュ・データを更新・破棄する

 ある特定の日時が来た場合や、ある一定の期間使用されなかったキャッシュ・データは自動的に破棄される。次のサンプル・プログラムは、これを実際に行うコードの例だ。

using System;

namespace CachingABSample
{
  class Program
  {
    static void Main(string[] args)
    {
      // 現在時刻+30分後にキャッシュ・データを自動的に破棄する
      Cache.Insert(“Key1”, cacheItem1, null,
        DateTime.Now.AddMinutes(30));

      // 30分間利用されなかったキャッシュ・データは自動的に破棄する
      Cache.Insert(“Key2”, cacheItem2, null,
        Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
    }
  }
}
任意の時間に応じてキャッシュ・データを削除するサンプル・プログラム(ASP.NETキャッシュを使った場合)

■依存関係にある外部ファイルが更新されたタイミングで、自動的にキャッシュ・データを更新・破棄する

 ASP.NETキャッシュはメモリ消費量や経過日時以外にも、ある特定のファイルやディレクトリが更新された場合や、すでにキャッシュされているほかのキャッシュ・データが破棄されたら、対象データも破棄されるなどの指定も可能である。次のコードは、それを実際に設定している例である。

using System;

public partial class Default : System.Web.UI.Page
{
  // ファイル(Sample.txt)が更新されると
  // キャッシュ・データが破棄される
  Cache.Insert(“Key1”, cacheItem1,
     new CacheDependency(“C:\\Sample.txt”));

  // ほかのキャッシュ・データが破棄されると、
  // キャッシュ・データが破棄される
  CacheDependency dependency =
    new CacheDependency(null, new string[]{“Key1”});
  Cache.Insert(“Key2”, cacheItem2, null, dependency);
}
外部ファイルが更新されたタイミングでキャッシュ・データを削除するサンプル・プログラム(ASP.NETキャッシュを使った場合)

 ここまでで解説してきたとおり、ASP.NETのキャッシュ機能は、実に多くの機能を持ってはいるのだが、実際の利用に当たっては、何よりもまず適切なデータがキャッシュされなければ意味がないということはいうまでもない。不適切なデータをキャッシュすると、パフォーマンスを向上させるどころか、逆に低下させることにもなりかねないのである。そこでデータをキャッシュするかしないかの判断は以下の指針に従うとよいだろう。

  • アプリケーション全体で使われたり、複数ユーザーから使われたりするデータである場合
  • 作成・取得に時間がかかるが、頻繁には更新されないデータである場合

 逆にデータベース・コネクションなどの希少な共有リソースは、キャッシュするよりもコネクション・プールを利用する方が効率的であり、DataReaderオブジェクトなどは常に接続がオープンであることから、キャッシュしない方がよいだろう。

 このようにASP.NETが提供するキャッシュ機能を効果的に用いれば、かなりのパフォーマンス向上を期待できるのだが、残念なことにこのキャッシュ機能はWebアプリでしか利用できない。これがASP.NETランタイム上で動作するコンポーネントの機能であれば、HttpContextオブジェクトを用いて同様のキャッシュ機能を利用することも可能であるが、これもASP.NETランタイム上であることが必須条件であるため、やはりWinアプリからは利用することができないのである。

 それ故、WinアプリにASP.NETキャッシュと同等のキャッシュ機能を持たせる必要が生じた場合は、アプリケーションの実装者がゼロから作りこむ必要があった。しかしこれから解説するCachingABを利用すればASP.NETキャッシュと同等なだけでなく、柔軟に機能の拡張も行えるキャッシュ機能をWinアプリで利用できるようになるのである。

 それではいよいよCachingABについて解説していくとしよう。


 INDEX
  連載:Enterprise Library概説
  Windowsアプリケーションに高機能なキャッシュ機能を実装しよう
  1.ASP.NETが提供するキャッシュ機能
    2.CachingABが提供するキャッシュ機能
 
インデックス・ページヘ  「Enterprise Library概説」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間