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 みたいなもんかと思ったがちょっと違った。