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

Joh*_*uiz 25 .net c# caching

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

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

但是,如果你看看DateTimeOffset的MSDN文档,它会说它"代表一个时间点...相对于协调世界时(UTC)." 另请参阅StackOverflow线程.

你看到了问题吗?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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ney 18

缓存遵循UTC时间以提供统一时间计算,因此您指定缓存条目应该到期的时间点(UTC),缓存将从现在开始计算适当的差异并按预期使其到期.

您的代码将无法按预期工作,因为您的绝对到期时间将您的缓存项目进入cacheExpiryInSeconds秒之后,导致立即驱逐.在不久的将来设置AbsoluteExpiration时,你无法共享CacheItemPolicy实例,我知道这很烦人.:)

  • 可能让你感觉更好的一件事是CacheItemPolicy是一个结构,因此每次调用创建它非常便宜. (2认同)