我们有一个 Web 应用程序,它从 SOAP Web 服务中检索大量数据,大约需要 4 到 5 分钟。为了确保用户不受此困扰,数据缓存如下:
//using Nlog to log caching behaviour
private Logger log = LogManager.GetCurrentClassLogger();
//a public actionresult to get the summaries with an ajax call or site24x7 service
public ActionResult GetSummariesAsync()
{
log.Info(String.Format("GetSummariesAsync called"));
List<ProjectDataSummary> summaries = GetAllSummaries();
log.Info(String.Format("{0} summaries found", summaries.Count));
List<ProjectDataSummary> cache = HttpContext.Cache["SummariesCache"] as List<ProjectDataSummary>;
log.Info(String.Format("{0} in cache", cache.Count));
return Json(summaries, JsonRequestBehavior.AllowGet);
}
private List<ProjectDataSummary> GetAllSummaries()
{
List<ProjectDataSummary> summaries = new List<ProjectDataSummary>();
//use setting in web.config if we want to force no cache, but set to false in released version
if (ConfigurationManager.AppSettings["NoCache"] == "true")
{
summaries = _service.GetAllSummaries();
}
else
{
//get summaries from cache if available
summaries = HttpContext.Cache["SummariesCache"] as List<ProjectDataSummary>;
if (summaries == null)
{
//cache empty, retrieve values
summaries = _service.GetAllSummaries();
//cache it
HttpContext.Cache.Add("SummariesCache", summaries, null, new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(this.cacheCallback));
}
}
return summaries;
}
private void cacheCallback(String K, Object v, CacheItemRemovedReason r)
{
CacheItemRemovedReason reason = r;
log.Info("Cache expired, reason: {0}", r.ToString());
}
我有一个来自www.site24x7.com的服务每小时都会创建缓存,所以理论上它应该会在早上 0:00 过一点,并让它创建另一个缓存。但是由于某种原因,缓存被删除了,网站每天创建一个新的几次,也给用户带来了极长的加载时间。
这是我的 Nlog 日志的一部分:
2015-09-22 18:31:07.8746 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 18:31:07.8901 GetSummariesAsync Info 263 summaries
2015-09-22 18:31:07.8901 GetSummariesAsync Info 263 in cache
2015-09-22 18:52:15.9684 cacheCallback Info Cache expired, reason: Removed
2015-09-22 19:02:06.9839 cacheCallback Info Cache expired, reason: Removed
2015-09-22 19:23:08.3590 cacheCallback Info Cache expired, reason: Removed
2015-09-22 19:31:42.7182 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:32:15.0776 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:32:46.2495 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:33:01.8276 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:33:18.3746 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:33:34.8589 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:34:10.7182 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:34:15.4215 GetSummariesAsync Info 263 summaries
2015-09-22 19:34:15.4215 GetSummariesAsync Info 263 in cache
2015-09-22 19:35:07.3121 GetSummariesAsync Info 263 summaries
2015-09-22 19:35:07.3121 GetSummariesAsync Info 263 in cache
2015-09-22 19:36:07.9213 GetSummariesAsync Info 263 summaries
2015-09-22 19:36:07.9213 GetSummariesAsync Info 263 in cache
2015-09-22 19:36:19.5309 GetSummariesAsync Info 263 summaries
2015-09-22 19:36:19.5309 GetSummariesAsync Info 263 in cache
2015-09-22 19:36:36.3588 GetSummariesAsync Info 263 summaries
2015-09-22 19:36:36.3588 GetSummariesAsync Info 263 in cache
2015-09-22 19:37:07.9996 GetSummariesAsync Info 263 summaries
2015-09-22 19:37:07.9996 GetSummariesAsync Info 263 in cache
2015-09-22 19:37:33.7183 GetSummariesAsync Info 263 summaries
2015-09-22 19:37:33.7183 GetSummariesAsync Info 263 in cache
2015-09-22 19:37:59.8747 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 19:37:59.8747 GetSummariesAsync Info 263 summaries
2015-09-22 19:37:59.8747 GetSummariesAsync Info 263 in cache
2015-09-22 19:44:00.2496 cacheCallback Info Cache expired, reason: Removed
2015-09-22 19:54:25.2183 cacheCallback Info Cache expired, reason: Removed
2015-09-22 20:34:55.3589 GetSummariesAsync Info GetSummariesAsync called
2015-09-22 20:34:55.3745 GetSummariesAsync Info 263 summaries
2015-09-22 20:34:55.3745 GetSummariesAsync Info 263 in cache
2015-09-22 20:44:32.5153 cacheCallback Info Cache expired, reason: Removed
2015-09-22 20:56:38.8746 cacheCallback Info Cache expired, reason: Removed
编辑
我已经实现了 NightOwl888 给出的答案,但无济于事,缓存不断被删除。
这是我当前 Nlog 文件中的一部分:
2015-09-27 20:05:29.9682 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 20:05:29.9682 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 20:23:51.5464 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:23:51.5464 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:23:51.5464 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:25:48.1714 Models.CachingBase`1.GetItemsCache Info Cache fileEntries created
2015-09-27 20:25:48.1714 Models.CachingBase`1.GetItemsCache Info Cache idCertificaat created
2015-09-27 20:26:46.3588 Controllers.HomeController.Index Info No cache found, Home/Index needs to create the cash Async
2015-09-27 20:26:46.7963 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 vanuit Host: 88.159.95.251
2015-09-27 20:27:26.9682 Models.CachingBase`1.GetItemsCache Info Cache GebouwProjectenSummaries created
2015-09-27 20:27:26.9682 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 20:27:26.9682 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 20:33:48.7340 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:33:48.7340 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:33:48.7340 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:38:21.0151 Models.CachingBase`1.GetItemsCache Info Cache fileEntries created
2015-09-27 20:38:21.0151 Models.CachingBase`1.GetItemsCache Info Cache idCertificaat created
2015-09-27 20:38:21.0620 Controllers.HomeController.Index Info No cache found, Home/Index needs to create the cash Async
2015-09-27 20:43:41.0620 Controllers.HomeController.Index Info No cache found, Home/Index needs to create the cash Async
2015-09-27 20:46:29.0620 Models.CachingBase`1.GetItemsCache Info Cache GebouwProjectenSummaries created
2015-09-27 20:57:21.5776 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:57:21.5776 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:57:21.5776 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 20:58:23.9553 Models.CachingBase`1.GetItemsCache Info Cache fileEntries created
2015-09-27 20:58:23.9553 Models.CachingBase`1.GetItemsCache Info Cache idCertificaat created
2015-09-27 20:58:23.9839 Controllers.HomeController.Index Info No cache found, Home/Index needs to create the cash Async
2015-09-27 21:04:24.5151 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 21:04:24.5151 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 21:05:31.8277 Models.CachingBase`1.GetItemsCache Info Cache fileEntries created
2015-09-27 21:05:31.8277 Models.CachingBase`1.GetItemsCache Info Cache idCertificaat created
2015-09-27 21:05:31.8432 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 72.5.230.111
2015-09-27 21:06:03.5307 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 72.5.230.111
2015-09-27 21:06:36.3433 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 120.138.27.125
2015-09-27 21:06:40.2651 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 119.81.237.98
2015-09-27 21:07:08.6401 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 120.138.27.125
2015-09-27 21:07:11.4057 Models.CachingBase`1.GetItemsCache Info Cache GebouwProjectenSummaries created
2015-09-27 21:07:11.4057 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:11.4057 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:11.4057 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:07:11.4057 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:11.4214 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:07:12.5620 Controllers.HomeController.GetSummariesAsync Info GetSummariesAsync triggered by User-Agent: Site24x7 vanuit Host: 119.81.237.98
2015-09-27 21:07:12.5620 Controllers.HomeController.GetSummariesAsync Info 263 summaries found
2015-09-27 21:07:12.5620 Controllers.HomeController.GetSummariesAsync Info 263 in cache found
2015-09-27 21:15:32.4370 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 21:15:32.4370 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
2015-09-27 21:15:32.4370 Controllers.HomeController.cacheCallback Info Cache expired, reason: Removed
可以看到,Site24x7 有时会连续多次调用 GetSummariesAsync 函数。
并且用户也(尽管很少)遇到问题。
从创建现金到取出现金之间的时间可以短至 8 分钟。
我现在禁用了我的 site24x7 检查,看看这是否是罪魁祸首。