簡潔にすること。 .Net Core Webアプリケーションのメモリキャッシュからすべての登録キーをリストすることはできますか?
IMemoryCacheインターフェイスに何も見つかりませんでした。
現在、IMemoryCache
インターフェースには、すべてのキャッシュキーを返すようなメソッドはありません。 このgithubの問題 コメントに従って、私はそれが将来追加されるとは思いません。
引用 Eilons コメント
キャッシングに関するアイデアの一部は、質問した瞬間に答えが変わった可能性があるため、これが利用できるかどうかは疑問です。つまり、どのキーが存在するのかがわかっているとします。しばらくすると、キャッシュが削除され、キーのリストが無効になります。
キーが必要な場合は、アイテムをキャッシュに設定し、必要に応じてそれを使用する間、アプリのキーのリストを維持する必要があります。
ここに別の有用なgithubの問題があります
.Net Coreにはまだそのようなものはありません。これが私の回避策です:
var field = typeof(MemoryCache).GetProperty("EntriesCollection", BindingFlags.NonPublic | BindingFlags.Instance);
var collection = field.GetValue(_memoryCache) as ICollection;
var items = new List<string>();
if (collection != null)
foreach (var item in collection)
{
var methodInfo = item.GetType().GetProperty("Key");
var val = methodInfo.GetValue(item);
items.Add(val.ToString());
}
MarkMの答えは私にとってはうまくいきませんでした、それは結果をICollectionにキャストしませんでしたが、私はアイデアを取り、私にとって非常にうまくいくこれを思いつきました。うまくいけば、それが他の誰かにも役立つでしょう:
// Get the empty definition for the EntriesCollection
var cacheEntriesCollectionDefinition = typeof(MemoryCache).GetProperty("EntriesCollection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
// Populate the definition with your IMemoryCache instance.
// It needs to be cast as a dynamic, otherwise you can't
// loop through it due to it being a collection of objects.
var cacheEntriesCollection = cacheEntriesCollectionDefinition.GetValue(instanceIMemoryCache) as dynamic;
// Define a new list we'll be adding the cache entries too
List<Microsoft.Extensions.Caching.Memory.ICacheEntry> cacheCollectionValues = new List<Microsoft.Extensions.Caching.Memory.ICacheEntry>();
foreach (var cacheItem in cacheEntriesCollection)
{
// Get the "Value" from the key/value pair which contains the cache entry
Microsoft.Extensions.Caching.Memory.ICacheEntry cacheItemValue = cacheItem.GetType().GetProperty("Value").GetValue(cacheItem, null);
// Add the cache entry to the list
cacheCollectionValues.Add(cacheItemValue);
}
// You can now loop through the cacheCollectionValues list created above however you like.
この概念を実装して、正規表現パターンによる削除を可能にしました。
完全な実装は Saturn72
githubリポジトリ 。場所が移動する可能性があるため、最近AspNet Coreに移行しています。リポジトリでMemoryCacheManager
を検索 これが現在の場所です