繁体   English   中英

获取ASP.NET Core 1中的所有缓存

[英]Get all cache in ASP.NET Core 1

版本是rc1。 在我的旧项目中,有类似的代码

System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache;
System.Collections.IDictionaryEnumerator cacheEnumerator = c.GetEnumerator();
while (cacheEnumerator.MoveNext())
{....}

在核心1中我使用IMemoryCache ,我可以通过键获得缓存

var c = this._memoryCache;
var data = c.Get("data");

我想创建一个列出所有缓存的视图。 如何在Core 1中获取所有缓存?

github上查看ASP.NET Core的MemoryCache实现的源代码,您可以看到该类没有公开任何扫描或迭代缓存条目列表的功能。

您最接近的是使用反射来读取内部缓存字典:

 private readonly Dictionary<object, CacheEntry> _entries;

将反射代码包装在一个接受IMemoryCache的扩展方法中并返回一个IEnumerable<CacheEntry>并且你很好 - 但是涉及到几个风险:

  1. 此实现特定于当前的预发布版本的ASP.NET CORE。 这可能会在较新的版本中发生变化,因为它是内部实现细节而不是合同的一部分。
  2. 这特定于Microsoft.Extensions.Caching.Memory.MemoryCache的实现,它只是IMemoryCache 一个实现。 您可能有一天会用不同的实现替换它,这将会破坏。
  3. 该实现包含一组锁,用于管理对缓存条目的并发访问。 如果直接迭代内部字典,当您尝试在更新条目时读取条目时,可能会遇到并发错误。 第一步是永远不要直接更新缓存条目,并始终通过IMemoryCache的方法,但即使这样,也存在风险。

但是,了解风险,您可以前进并完成工作。

除了使用反射之外,您还可以在每次添加到缓存时添加到字典中,并使用缓存策略中的回调进行维护。 如果以这种方式处理它,则更少依赖于.net MemoryCache 可能会对Dictionary有一些并发性问题,但只要它在更新和删除时被锁定就应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM