通过.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);
    }
}

通过.net MemoryCache中的CacheItemPolicy使缓存项过期

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

你的代码不会像预期的那样工作,因为你的绝对过期将是,在你的缓存项被输入之前,一旦cacheExpiryInSeconds秒过去,导致立即被删除。当AbsoluteExpiration在不久的将来设置时,您不能共享CacheItemPolicy实例,我知道这很烦人。:)