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

2024-04-20

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

MSDN 文档 http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.absoluteexpiration.aspx说“缓存条目被逐出之前必须经过的时间段。”它使用 System.DateTimeOffset 来定义“时间段”。

但如果你看看DateTimeOffset 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx,它说它“代表一个时间点……相对于协调世界时 (UTC)”。也参考这个StackOverflow线程 https://stackoverflow.com/questions/9073149/difference-between-datetime-and-datetimeoffset?lq=1.

你看到问题了吗? AbsoluteExpiration 期望一个“时间段”(例如 5 秒或 2 小时),但它需要一个表示“时间点”的对象(例如 2012 年 12 月 21 日,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 表示),缓存将计算与现在的适当差异并按预期过期。

您的代码将无法按预期工作,因为您的绝对到期时间将是before您的缓存项已输入一次cacheExpiryInSeconds几秒钟过去了,导致即时驱逐。在不久的将来设置 AbsoluteExpiration 时,您无法共享 CacheItemPolicy 实例,我知道这很烦人。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 .NET MemoryCache 中的 CacheItemPolicy 使缓存项过期 的相关文章

随机推荐