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

标签 c# .net caching

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

The MSDN documentation for it说“驱逐缓存条目之前必须耗时段。”它使用 System.DateTimeOffset 来定义“时间段”。

但是如果你看DateTimeOffset's MSDN documentation ,它说它“代表一个时间点……相对于协调世界时 (UTC)”。另请引用此 StackOverflow thread .

你看到问题了吗? 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 中过期的时间点,缓存将计算与现在的适当差异并按预期过期。

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

关于c# - 通过 .NET MemoryCache 中的 CacheItemPolicy 使缓存项过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972641/

相关文章:

c# - 在键盘输入时暂停音乐

c# - 如何获得子数组而不进行克隆

C# 如何使用 NSwag 处理多态模型

c# - 以编程方式向 ListView 发送点击消息以选择/取消选择项目

c# - 将命名空间传递给函数

caching - RavenDB:如何防止 RAM 利用率过高?

c# - SelectPdf 中的换行符

.net - 您使用什么工具来测试和开发 XPath 表达式?

ruby-on-rails - 如何使用 Active Model Serializers (0.8) 缓存数组?

c# - .NET和负载均衡器?