【问题标题】:MemoryCache in System.Runtime.Caching: items don't expireSystem.Runtime.Caching 中的 MemoryCache:项目不会过期
【发布时间】:2014-04-06 17:25:39
【问题描述】:

我目前尝试将项目插入到 MemoryCache.Default 实例中,该实例有效。但物品不会过期!轮询间隔默认为 2 分钟,MemoryCache 没有具体设置。

添加项目例程是这样的:

string key = "someKey";
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes();

if (!MemoryCache.Default.Contains(key))
{
    MemoryCache.Default.Add(
        new CacheItem(key, faultyItem),
        new CacheItemPolicy() 
        { 
            AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3)
        });
}

但是,缓存中的项目永不过期!我等了 10 多分钟,它们还在缓存中。主要目的是通过尝试每隔几秒钟处理一次查询来防止它们淹没数据库。它们每隔几秒钟检查一次,但没有 SlidingExpiration。他们应该在大约 3 分钟后再次检查,5 分钟因为最大延迟仍然是可以容忍的。

我不想在 XML 等代码之外进行任何配置。如果不可能,是否有一个很好的替代 MemoryCache 的方法?也许通过参数和属性使用数字/对象键和配置?

【问题讨论】:

  • 您确定您的环境在 UTC 时区运行吗?你怎么“等”了10分钟?

标签: .net caching memorycache cache-expiration content-expiration


【解决方案1】:

我使用您问题中的代码 sn-p 从头开始​​设置一个简单的试用应用程序。我所做的唯一修改如下:var faultyItem = "test";

监视语句 MemoryCache.Default.Contains(key) 确认 3 分钟后,该项目已从缓存中逐出,因为该语句返回了 false

一种可能性是,在您的应用程序的其他地方,您已经使用相同的没有过期的键将项目放入 MemoryCache,因此它永远不会脱落,并且永远不会使用新的项目更新确实有绝对有效期。除了搜索您的应用程序之外,一种测试方法是使用命名缓存而不是默认缓存进行此特定操作,以识别潜在的共享使用。即static MemoryCache testCache = new MemoryCache("TestCache")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 2016-02-15
    • 1970-01-01
    • 2013-06-03
    • 2011-10-16
    • 2019-08-13
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多