如何检查System.Runtime.Caching.ObjectCache中的缓存策略?

RPM*_*984 13 c# asp.net caching memorycache

我正在使用新的.NET 4.0 Caching命名空间:System.Runtime.Caching.

现在,我只是做一些原型/摆弄新的API,以便找出真正的应用程序的最佳选择.

与此一致,我正在尝试创建一个页面(ASP.NET MVC),它基本上会转储缓存中的所有内容,尤其是以下信息:

  • 缓存密钥
  • 缓存对象
  • 缓存策略(到期日等)
  • 缓存依赖项(如果有)

但是,除了键/对象之外,我似乎无法获得任何东西.

这是我正在玩的代码:

public ActionResult Index()
{
   var cache = MemoryCache.Default;

   // i can get the list of cache keys like this:
   var cacheKeys = cache.Select(kvp => kvp.Key).ToList();

   // i can also get a strongly-typed "CacheItem" like this:
   CacheItem item = cache.GetCacheItem("someKey");

}
Run Code Online (Sandbox Code Playgroud)

我希望"CacheItem"类会暴露我需要的信息(到期,依赖等 - 至少作为"getters").

但事实并非如此.它拥有的只是键,值和区域名称的属性.

我如何检查缓存中的项目并吐出我需要的信息?

我缺少名称空间/类吗?

编辑

看起来有一个ChangeMonitor类,但是再次 - 这不会给出过期信息,它只允许您在删除缓存项时订阅事件.

必须是一个办法只有抢在缓存中的项目,而当他们到期.

编辑2

不知道这是否应该是一个单独的问题,而且 - 我对我应该给我的ObjectCache的生命周期感到困惑.MSDN说它不是单例,你实际上可以创建多个ObjectCache实例.这意味着什么,我必须在访问ObjectCache实例时使用完全锁定的单例?

Lee*_*ale 9

我不认为有一种方法可以在CacheItemPolicy添加到缓存集合后检索它.

解决此问题的最佳方法是将策略对象与要缓存的项目一起缓存,只需将"策略"附加到密钥名称,以便以后可以检索策略.这显然假设您可以控制首先将项目实际添加到缓存中.示例如下:

public ActionResult Index()
    {
        string key = "Hello";
        string value = "World";

        var cache = MemoryCache.Default;
        CacheItemPolicy policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now.AddDays(1);
        cache.Add(new CacheItem(key, value), policy);
        cache.Add(new CacheItem(key + "Policy", policy), null);

        CacheItem item = cache.GetCacheItem(key);
        CacheItem policyItem = cache.GetCacheItem(key + "Policy");
        CacheItemPolicy policy2 = policyItem.Value as CacheItemPolicy;

        ViewBag.Message = key + " " + value;

        return View();
    }
Run Code Online (Sandbox Code Playgroud)