しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

.NET Framework 4 から追加された ObjectCache と互換性のある RedisCache クラスを作った

.NET Framework 4 から追加された System.Runtime.Caching 名前空間に ObjectCache クラスと、その唯一の実装である MemoryCache クラスが用意されています。

ObjectCache クラス (System.Runtime.Caching)

ASP.NET には専用のキャッシュが用意されていますが、あれはプロバイダーとかで提供されていないのでカスタマイズ不可能でとても残念な感じです。OutputCacheProvider よりも先に対応してほしかった気持ちでいっぱいです。

プロバイダーで提供されていれば、中身を Redis や Azure Table とかに入れ替えることが出来たのですが、仕方ないので ObjectCache を実装した RedisCache クラスを作成してみました。

https://github.com/shibayan/RedisCacheClient

名前がとても安易ですが、一応 NuGet にもアップロードしてあります。

NuGet Gallery | RedisCacheClient 0.0.1

使い方は ObjectCache を実装しているので、MemoryCache クラスと同じように使えます。NuGet にアップロードしてあるので、パッケージをインストールするだけでコードを書きはじめることが出来ます。

// インメモリのキャッシュとの切り替えが簡単
//var cache = MemoryCache.Default;

// Redis Cache を使う
var cache = new RedisCache("******.redis.cache.windows.net,password=*******,ssl=false");

// キャッシュに値を追加する
cache.Set("kamebuchi", "抱かれたい男 No.1", ObjectCache.InfiniteAbsoluteExpiration);

cache.Set("kazuakix", "Surface Pro 3 を無限に買う男", DateTimeOffset.Now.AddSeconds(10));

// 複数キーの値を一括で取得
var results = cache.GetValues(new[] { "kamebuchi", "kazuakix" });

foreach (var item in results)
{
    Console.WriteLine("{0} - {1}", item.Key, item.Value);
}

ObjectCache が非同期なインターフェースを持っていないので、今回は全て同期メソッドで処理を組みました。パイプラインとかは上手く使えていないと思うので、それは追い追い見ていければ良いなと思います。

実行すると、値を Redis に追加してから取得できていることがわかります。

f:id:shiba-yan:20140907233353p:plain

そして redis-cli.exe から直接コマンドを叩き込んで調べてみると、有効期限を設定したキーだけが消えていることも確認できます。

f:id:shiba-yan:20140907233724p:plain

インメモリや Redis で統一されたインターフェースのキャッシュクライアントが欲しかったので、個人的にはこれで満足しています。

今回はデータの格納に BinarySerializer を使いましたが、他のものに変えてもいいかもしれないですね。