我目前尝试将项目插入到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?也许使用数字/对象键以及通过参数和属性进行配置?
答案 0 :(得分:2)
我从头开始使用您问题中的代码段设置一个简单的试用版应用程序。我做的唯一修改如下:var faultyItem = "test";
对语句MemoryCache.Default.Contains(key)
进行监视,确认3分钟后该项目已从缓存中逐出,因为该语句返回false
。
一种可能性是,在您的应用程序的其他位置,您已经使用没有过期的相同密钥将项目放入MemoryCache,因此它永远不会丢失,并且永远不会使用新项目更新确实有一个绝对的到期日。除了搜索您的应用程序之外,测试此方法的一种方法是使用命名缓存而不是此特定操作的默认缓存来识别潜在的共享使用。即static MemoryCache testCache = new MemoryCache("TestCache")
。