MemoryCache インスタンスから多数の項目を削除するための推奨される方法は何ですか?
この質問に関する議論に基づいて、アプリケーション全体に単一のキャッシュを使用し、キーに名前空間を使用して、複数の論理タイプのアイテムを同じインスタンスにキャッシュできるようにすることが推奨されるアプローチのようです。
ただし、単一のキャッシュ インスタンスを使用すると、キャッシュから多数のアイテムを期限切れにする (削除する) という問題が残ります。特に、特定の論理タイプのすべてのアイテムを期限切れにする必要がある場合。
現時点で私が見つけた唯一の解決策は、この質問への回答に基づいていましたが、キャッシュ内のすべてのキーを列挙し、名前空間をテストする必要があるため、パフォーマンスの観点からはあまり良くありません。時間がかかる!
現時点で思いついた唯一の回避策は、キャッシュ内のすべてのオブジェクトにバージョン番号を付けた薄いラッパーを作成し、オブジェクトがアクセスされるたびに、キャッシュされたバージョンが現在のバージョンと一致しない場合は破棄することです。したがって、特定のタイプのすべてのアイテムをクリアする必要があるときはいつでも、現在のバージョン番号を上げて、キャッシュされたすべてのアイテムを無効にします。
上記の回避策はかなりしっかりしているようです。しかし、同じことを達成するためのより簡単な方法がないのではないかと思わずにはいられません。
これは私の現在の実装です:
private class MemCacheWrapper<TItemType>
where TItemType : class
{
private int _version;
private Guid _guid;
private System.Runtime.Caching.ObjectCache _cache;
private class ThinWrapper
{
public ThinWrapper(TItemType item, int version)
{
Item = item;
Version = version;
}
public TItemType Item { get; set; }
public int Version { get; set; }
}
public MemCacheWrapper()
{
_cache = System.Runtime.Caching.MemoryCache.Default;
_version = 0;
_guid = Guid.NewGuid();
}
public TItemType Get(int index)
{
string key = string.Format("{0}_{1}", _guid, index);
var lvi = _cache.Get(key) as ThinWrapper;
if (lvi == null || lvi.Version != _version)
{
return null;
}
return lvi.Item;
}
public void Put(int index, TItemType item)
{
string key = string.Format("{0}_{1}", _guid, index);
var cip = new System.Runtime.Caching.CacheItemPolicy();
cip.SlidingExpiration.Add(TimeSpan.FromSeconds(30));
_cache.Set(key, new ThinWrapper(item, _version), cip);
}
public void Clear()
{
_version++;
}
}