通过.NET MemoryCache中的CacheItemPolicy使缓存项目到期

我对CacheItemPolicy上的AbsoluteExpiration属性感到困惑。

它的MSDN文档说“在逐出缓存条目之前必须经过的时间段。” 它使用System.DateTimeOffset来定义“时间段”。

但是如果你看一下DateTimeOffset的MSDN文档 ,就会说它“代表了一个时间点…相对于协调世界时(UTC)。” 也参考了这个StackOverflow线程 。

你看到了这个问题吗? AbsoluteExpiration期望“时间段”(例如5秒或2小时),但它需要一个代表“时间点”的对象(如美国东部时间2012年12月21日06:14:00)。

在下面的代码中,我为所有项目定义了一个策略。 我希望每个项目在添加后都会cacheExpiryInSeconds秒。 有人可以validation我这样做是否正确?

 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实例,我知道这很烦人。 🙂