コンピュータ関連でキャッシュ機能といいますと、読み込んだデータを次に利用するためにメモリーなど高速な記憶装置に保存しておき、同じデータが必要な場合キャッシュから取り出すことで、パフォーマンスを向上させる仕組みのことだと思われます。
dictionary<string, T>あたりを使って似たような機能を持たせたことがありますが、使用するメモリーの上限設定やキャッシュデータの解放条件、あとマルチスレッド時の排他処理など、しっかりプログラミングしようと思うと結構大変です。
MemoryCacheが利用できるのであれば、プログラミング的に楽が出来そうなので試してみたいと思います。
プロジェクトの作成
PowerShellで実行。要dotnet.exe
mkdir MemoryCacheSample
cd MemoryCacheSample
dotnet new console
dotnet add package System.Runtime.Caching
code .
ソースコード
ファイル名:Program.cs
using System;
using System.Runtime.Caching;
namespace MemoryCacheSample
{
class Program
{
static void Main()
{
var cache = MemoryCache.Default;
var policy = new CacheItemPolicy
{
SlidingExpiration = new TimeSpan(0, 0, 3), // 有効期限を3秒間にセット
RemovedCallback = arg =>
{
Console.WriteLine("key:{0}が削除された。", arg.CacheItem.Key);
},
};
string key = "a";
string result = "";
// キャッシュにデータ無い場合
if (cache[key] == null)
{
// データを取得(生成)しキャッシュにセット
string setValue = "1";
cache.Set(key, setValue, policy);
}
// キャッシュからデータを取得しキャスト
result = cache[key] as string;
Console.WriteLine("key:{0}, value:{1}", key, result);
// key:a, value:1
// 20秒待つ
System.Threading.Thread.Sleep(20000);
// key:aが削除された。<= 有効期限切れ
// 追加
cache.Add("b", "2", policy);
cache.Add("c", "3", policy);
cache.Add("d", "4", policy);
// キャッシュに使用できる物理メモリの量をバイト単位で取得
Console.WriteLine("CacheMemoryLimit:{0}GB", cache.CacheMemoryLimit / 1024 / 1024 / 1024);
// CacheMemoryLimit:4GB
// キャッシュに使える物理メモリの割合
Console.WriteLine("PhysicalMemoryLimit:{0}%", cache.PhysicalMemoryLimit);
// PhysicalMemoryLimit:99%
// キャッシュアイテムのエントリ数
Console.WriteLine("GetCount():{0}", cache.GetCount());
// GetCount():2
// キャッシュアイテムの削除
cache.Remove("d");
// key:dが削除された。
// キャッシュの全てのエントリを解放
cache.Dispose();
//key:bが削除された。
//key:cが削除された。
}
}
}
コメント