我不确定除了有其他人看到此问题之外我还有其他具体问题吗?如果是这样,是否有已知的解决方法/修复方法?我没有在谷歌上找到关于这个主题的任何内容。
基本上,我们有一个ASP.NET MVC应用程序,我们在localhost上运行,在内存缓存中广泛使用ASP.NET。我们将许多重复的请求缓存到Db。
昨天,我们将两台开发机器升级到了Windows 10 Creators Update。在更新之后,我们注意到仅在这些计算机上的页面请求开始被抓取。每页超过30秒。
经过一些调试和查看日志后,我们发现每个请求系统向Db发出200-300次相同的请求。以前,这只是第一次缓存,并且在缓存过期之前该请求不会再次发生。
我们看到的是这段代码:
var myObject = LoadSomethingFromDb();
HttpRuntime.Cache.Insert("test", myObject);
var test = HttpRuntime.Cache.Get("test");
在某些时候,Get即使在插入代码之后就会返回NULL,即使缓存甚至没有接近满的方式。该应用程序刚刚开始。
还有人看到这个吗?
答案 0 :(得分:0)
没关系。我们在Absolute Cache Expiration参数中得到了一点,我忽略了它包含在问题的代码中,因为我不认为这是相关的。
我们使用的绝对缓存过期时间为:
DateTime.Now.AddMinutes(60)
相反,我们应该一直在使用:
DateTime.UtcNow.AddMinutes(60)
不确定为什么前者在创建者更新之前在Windows中很好,但是对UtcNow的更改似乎使缓存再次起作用。
答案 1 :(得分:0)
似乎在windows创建者更新后,cache.Insert重载方法的行为表现不同。
[Test]
public void CanDemonstrateCacheExpirationInconsistency()
{
var cache = HttpRuntime.Cache;
var now = DateTime.Now;
var key1 =$"Now{now.Ticks}";
var key2 = key1+"2";
var key3 = $"UtcNow{now.Ticks}";
var key4 = key3 + "2";
cache.Insert(key1, true, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
cache.Insert(key2, true, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration,CacheItemPriority.Default,null);
cache.Insert(key3, true, null, DateTime.UtcNow.AddHours(1), Cache.NoSlidingExpiration);
cache.Insert(key4, true, null, DateTime.UtcNow.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
Assert.That(cache.Get(key1), Is.Null); //Using this overload with datetime.now expires the cache immediately
Assert.That(cache.Get(key2), Is.Not.Null);
Assert.That(cache.Get(key3), Is.Not.Null);
Assert.That(cache.Get(key4), Is.Not.Null);
}