我对 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 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 中过期的时间点,缓存将计算与现在的适当差异并按预期过期。
您的代码将无法按预期工作,因为一旦 cacheExpiryInSeconds
秒过去,您的绝对到期将之前您的缓存项被输入,导致立即 驱逐。当在不久的将来设置 AbsoluteExpiration 时,您不能共享 CacheItemPolicy 实例,我知道这很烦人。 :)
关于c# - 通过 .NET MemoryCache 中的 CacheItemPolicy 使缓存项过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972641/