我对CacheItemPolicy上的AbsoluteExpiration属性感到困惑。
The MSDN documentation for it说“在逐出缓存条目之前必须经过的时间段。”它使用System.DateTimeOffset来定义“时间段”。
但是如果你看一下DateTimeOffset's MSDN documentation,就会说它“代表一个时间点...相对于协调世界时(UTC)。”另请参阅此StackOverflow thread。
你看到了问题吗? AbsoluteExpiration期望一个“时间段”(如5秒或2小时),但它需要一个代表“时间点”的对象(如美国东部时间2012年12月21日,06:14:00)。
在下面的代码中,我为所有项目定义了一个策略。我希望每个项目在添加后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);
}
}
答案 0 :(得分:17)
缓存遵循UTC时间以提供统一时间计算,因此您指定缓存条目到期的时间点(UTC),缓存将从现在开始计算适当的差异并按预期使其到期。
您的代码将无法按预期运行,因为在cacheExpiryInSeconds
秒过后,您的缓存项目输入之前 ,导致立即逐出。在不久的将来设置AbsoluteExpiration时,你无法共享CacheItemPolicy实例,我知道这很烦人。 :)