我对 CacheItemPolicy 上的 AbsoluteExpiration 属性感到困惑。
MSDN 文档 http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.absoluteexpiration.aspx说“缓存条目被逐出之前必须经过的时间段。”它使用 System.DateTimeOffset 来定义“时间段”。
但如果你看看DateTimeOffset 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx,它说它“代表一个时间点……相对于协调世界时 (UTC)”。也参考这个StackOverflow线程 https://stackoverflow.com/questions/9073149/difference-between-datetime-and-datetimeoffset?lq=1.
你看到问题了吗? AbsoluteExpiration 期望一个“时间段”(例如 5 秒或 2 小时),但它需要一个表示“时间点”的对象(例如 2012 年 12 月 21 日,06:14:00 EST)。
在下面的代码中,我为所有项目定义了一个策略。我希望每件商品都过期cacheExpiryInSeconds
添加后几秒钟。有人可以验证我是否以正确的方式这样做?
public class MyCache : IRoutingInfoCache
{
MemoryCache _routingInfoCache;
CacheItemPolicy _cachePolicy;
public MyCache(int cacheExpiryInSeconds)
{
_routingInfoCache = new MemoryCache("myCache");
_cachePolicy = new CacheItemPolicy() {
AbsoluteExpiration =
new DateTimeOffset(
DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
};
}
public void Put(string key, object cacheItem)
{
// based on how I constructed _cachePolicy, will this item expire
// in cacheExpiryInSeconds seconds?
_routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
}
}
缓存遵循 UTC 时间以提供统一的时间计算,因此您可以指定缓存条目应过期的时间点(以 UTC 表示),缓存将计算与现在的适当差异并按预期过期。
您的代码将无法按预期工作,因为您的绝对到期时间将是before您的缓存项已输入一次cacheExpiryInSeconds
几秒钟过去了,导致即时驱逐。在不久的将来设置 AbsoluteExpiration 时,您无法共享 CacheItemPolicy 实例,我知道这很烦人。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)