MemoryCache でアプリケーション内キャッシュ
System.Runtime.Caching.Cache を使うと、アプリケーション単位にデータをキャッシュさせることができる。
Web サーバー起動時にデータを読み込んで永続化させたい時などに便利だ。
string GetContent() { var cache = MemoryCache.Default; var content = cache["content"] as string; if(content != null) { return content; } // キャッシュされてなかったら元データを取得してキャッシュする var policy = new CacheItemPolicy { absoluteExpiration = DateTimeOffset.Now.AddSeconds(100); }; return cache.AddOrGetExisting("content", ReadContent(), policy); } string ReadContent() { // DB とかファイルから読み込んで返す ... }
CacheItemPolicy
キャッシュ エントリーの有効期限などを保持する。
特に指定しない場合はキャッシュは削除されない。
削除された、または更新されたときのデリゲートを指定することもできる。
AddOrGetExisting
上記の例では content というキーでキャッシュを保存している。
このメソッドは、このキーで値を書き込みにいくが、すでに書き込まれていたらその値をそのままとってくる、というものだ。
Atomicity を担保するためのメソッド。マルチスレッドじゃなかったら Set でよい。
ConcurrentDictionary の GetOrAdd みたいなもんかと思ったがちょっと違った。