27

我对 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);
    }
}
4

1 回答 1

18

缓存遵循 UTC 时间以提供统一的时间计算,因此您指定缓存条目应过期的时间点(以 UTC 为单位),缓存将计算与现在的适当差异并按预期将其过期。

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

于 2013-06-06T21:42:10.037 回答