通过.net MemoryCache中的CacheItemPolicy使缓存项过期
本文关键字:缓存 过期 CacheItemPolicy net MemoryCache 中的 通过 | 更新日期: 2023-09-27 18:17:21
我对CacheItemPolicy上的AbsoluteExpiration属性感到困惑。
它的MSDN文档说"在缓存条目被驱逐之前必须经过的一段时间。"它使用一个系统。DateTimeOffset来定义"时间段"。
但是如果你看一下DateTimeOffset的MSDN文档,它说它"代表一个时间点……相对于协调世界时(UTC)。"也参考这个StackOverflow线程。
你看到问题了吗?AbsoluteExpiration需要一个"时间段"(如5秒或2小时),但它需要一个表示"时间点"的对象(如Dec 21, 2012, 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实例,我知道这很烦人。:)