【问题标题】:How to get expiry date for cached item?如何获取缓存项目的到期日期?
【发布时间】:2011-07-18 20:38:32
【问题描述】:

我在 MemoryCache 中存储了一个对象:

void foo()
{
  ObjectCache cache = MemoryCache.Default;
  SomeClass obj = cache["CACHE_KEY"] as SomeClass;
  if (null == obj )
  {
     obj = new SomeClass(); ....
     CacheItemPolicy policy = new CacheItemPolicy();
     //update
     policy.AbsoluteExpiration = DateTime.Now+TimeSpan.FromMinutes(1);
     cache.Set("CACHE_KEY", obj, policy);
  }
  else
  {
     //get expiry date 
  }
  .....
}

如果缓存包含对象,是否可以通过某种方式获取过期日期?

【问题讨论】:

  • 为什么不创建一个包含要缓存的对象及其到期日期的复合对象?
  • @Jeremy McGee:它会起作用,但也许还有其他方法可以这样做......我只是想确保我不会重新发明轮子。

标签: c# asp.net


【解决方案1】:

由于您设置了滑动到期,不是总是从您访问它开始 10 分钟吗?如果对象为空,缓存条目已经过期,如果不是,过期(在上面的代码中)总是从你检查的时间开始 10 分钟?

或者您可以拥有一个基础对象(所有可缓存对象都继承自该对象),其中到期时间作为您添加到缓存时设置的属性。当您提取对象时,您检查属性并且您有到期时间来计算差异。只是一个想法。

【讨论】:

  • 哎呀,我的错 - 它应该是 AbsoluteExpiration,我只是从错误的来源粘贴它,+1 指出它。
  • 在我的回答中添加了另一个选项,不确定这是否适合您。我看到有人添加了相同效果的评论,但我是第一个;)
  • (第二个选项) - 它会起作用,但我相信它可能是一个更好的方法(我不确定;也许这是唯一的选择)。
  • 为什么需要到期时间?
  • “从你访问它的时间开始不是总是 10 分钟” 那会是……什么时候?我认为希望能够进行测试的关键是您不知道有人上次访问它的时间。并且大概您不希望您对过期时间的检查计为重置滑动过期的访问,因为这会破坏目的。
【解决方案2】:

如前所述,将对象保存到内存缓存后保存到期值,

cache.Set(DataKey, DataToStore, policy);
cache.Set("MemCacheExpiry", DateAndTime.Now.AddHours(6), policy);
        

然后从过期键读取过期:

public static DateTime CheckCachedExpiry()
{
    DateTime MemCacheExpiryDate = default(DateTime);
    MemCacheExpiryDate = Convert.ToDateTime(MemoryCache.Default.Get("MemCacheExpiry"));
    return MemCacheExpiryDate;
}

【讨论】:

  • 好吧,我想。但是大概 Cache 对象知道过期时间是什么时候。人们会认为有一种方法可以询问它而无需独立重新计算时间。
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 2011-11-04
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多