.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 に追加してから取得できていることがわかります。
そして redis-cli.exe から直接コマンドを叩き込んで調べてみると、有効期限を設定したキーだけが消えていることも確認できます。
インメモリや Redis で統一されたインターフェースのキャッシュクライアントが欲しかったので、個人的にはこれで満足しています。
今回はデータの格納に BinarySerializer を使いましたが、他のものに変えてもいいかもしれないですね。