BEACHSIDE BLOG

Azure とか C# 好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

ASP.NET Core の インメモリー キャッシュ 機能を使う

ASP.NET Core 2.2 で In-Memory にデータをキャッシュしておくための専用の機能のひとつ、System.Runtime.Caching/MemoryCache の使い方について軽く整理してみました。

f:id:beachside:20190611183455j:plain

In-Memory キャッシュの利用ガイドライン

公式ドキュメントのCache guidelinesにざっくり以下のことが書いてあります。一般的なことですが心しておきましょう。

  • コードは常にデータを取得するための代替オプションを持つべきであり、利用可能なキャッシュされた値には依存すべきではない。
  • キャッシュは希少なリソース、メモリを使用するので、キャッシュの増加に制限をつけましょう:
    • 外部入力の値をキャッシュキーとして使用しないでください。
    • 有効期限を設けてキャッシュの増加を制限しましょう。
    • ASP.NET Coreのランタイムでメモリ増加に基づくキャッシュサイズの制限はしていません。キャッシュサイズを制限は開発者次第です。


(´-`).。oO(日本語のドキュメントは機械翻訳の精度が微妙なので時間作って Feedback せねば...と思ったり思わなかったり...

コーディング

ASP.NET Core MVC のプロジェクトを作って進めます。

Nuget Package のインストール

System.Runtime.Caching をインストールしておきましょう。手順は省略します。

DI

Startup.cs の ConfigureServices メソッドで、以下の一行を追加すればOKです。

services.AddMemoryCache();

あとは使いたい class のコンストラクターで DI すればよいです。

動かしてみる

こんなコードを書いてみました。

12行目

DI で IMemoryCache のインスタンスを受け取っています。もちろんまだ自分で何も値をセットしてません。

17行目 - 31行目

_memoryCache から TryGetValuetime ってキーの値を取得してみました。値がなければセットしています。MemoryCacheEntryOptionsSetSlidingExpiration を 5 秒でセットしましたが、これは5秒以内に連続してアクセスしてたらずっと同じ値を保持しますが、アクセスがなくなってから5秒経つと空になります。

MemoryCacheEntryOptions は、メモリー自体のサイズを制限できたり色々あるので、実際に使うときはさらっと見ておくとよいでしょう。


19行目でキャッシュから値を取得するのに TryGetValue メソッドを使いましたが、他に GetOrCreate メソッドや Get<T> でGenerics でとれるメソッドもあったりなので、いい感じで使えそうです。

GetOrCreate メソッドを使えば、19行目-27行目は以下のように書き換えることができます。

var cacheTime = _memoryCache.GetOrCreate("time", entry =>
{
    entry.SlidingExpiration = TimeSpan.FromSeconds(5);
    return DateTime.Now;
});
34行目 - 38行目

値を更新しているところです 。みたまんまなので特に説明はないです。

おわりに

実用的には、自分で IMemoryCache の操作を隠蔽する class 作って更新のライフサイクルもいい感じにして、あとは DI に登録して使うってところでしょうかね。

今回はもっともシンプルな In-memory キャッシュをみました。
他にも Distributed caching (分散キャッシュ)や Response Caching Middleware (応答キャッシュミドルウエア)があります。個人的には、興味薄目な部分ですが用途に応じてここら辺も使いこなしていきたいです。

参考

Cache in-memory in ASP.NET Core | Microsoft Docs