web-dev-qa-db-ja.com

asp.netコアのメモリキャッシュキーのリストを取得する方法

簡潔にすること。 .Net Core Webアプリケーションのメモリキャッシュからすべての登録キーをリストすることはできますか?

IMemoryCacheインターフェイスに何も見つかりませんでした。

7
Carlos

現在、IMemoryCacheインターフェースには、すべてのキャッシュキーを返すようなメソッドはありません。 このgithubの問題 コメントに従って、私はそれが将来追加されるとは思いません。

引用 Eilons コメント

キャッシングに関するアイデアの一部は、質問した瞬間に答えが変わった可能性があるため、これが利用できるかどうかは疑問です。つまり、どのキーが存在するのかがわかっているとします。しばらくすると、キャッシュが削除され、キーのリストが無効になります。

キーが必要な場合は、アイテムをキャッシュに設定し、必要に応じてそれを使用する間、アプリのキーのリストを維持する必要があります。

ここに別の有用なgithubの問題があります

MemoryCacheにGetEnumerator()はありますか?

1
Shyju

.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());
 }
18
MarkM

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.
9
dislexic

この概念を実装して、正規表現パターンによる削除を可能にしました。

完全な実装は Saturn72 githubリポジトリ 。場所が移動する可能性があるため、最近AspNet Coreに移行しています。リポジトリでMemoryCacheManagerを検索 これが現在の場所です

1

プロジェクトをDebuggingモードで実行し、Breakpointを含む行にIMemoryCacheを設定して、フィールドと全体を確認できます。

Cache Entries

0