0

我目前尝试将项目插入 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 的方法?也许通过参数和属性使用数字/对象键和配置?

4

1 回答 1

2

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

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

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

于 2014-04-25T03:16:30.083 回答