"预热"ASP.NET缓存的策略

RPM*_*984 11 asp.net asp.net-mvc caching .net-4.0 asp.net-mvc-3

我有一个ASP.NET MVC 3/.NET Web应用程序,它是大量数据驱动的,主要围绕"地点"(纽约,加利福尼亚等)的概念.

无论如何,我们有一些非常繁忙的数据库查询,它们在完成后会被缓存.

例如:

public ICollection<Location> FindXForX(string x)
{
   var result = _cache.Get(x.ToKey()) as Locaiton; // try cache

   if (result == null) {
      result = _repo.Get(x.ToKey()); // call db
      _cache.Add(x.ToKey(), result); // add to cache
   }

   return result;
}
Run Code Online (Sandbox Code Playgroud)

但我不想让不幸的第一个用户等待这个数据库调用.

数据库调用可能需要40-60秒,远远超过ASP.NET请求的默认超时.

当我的应用程序启动时或之后不久,我想对某些"热门"位置(例如纽约,加利福尼亚州)的这些调用进行"预热".

我不想简单地在Global asax(Application_Start)中执行此操作,因为应用程序启动时间太长.(我计划在15个地点预先缓存,这样几分钟的工作).

有什么办法可以异步启动这个逻辑吗?也许旁边的服务是更好的选择?

我能想到的唯一其他选择是有一个管理页面,其中包含这些操作的按钮.因此,管理员(例如我)可以在应用启动后启动这些查询.这将是最简单的解决方案.

有什么建议?

And*_*nea 6

查看IIS 7.5的"始终运行"应用程序设置.这基本上做的是在现有的应用程序池被回收时准备好应用程序池.当然,第一次需要40-60秒,但之后事情会很快,除非你重新启动机器.


Sco*_*ein 5

快速而肮脏的方式是发射一个Task来自Application_Start

但我发现将这个功能包装到一些基础结构中是很好的,这样你就可以创建一个〜/ Admin/CacheInfo页面来让你监控可能在加载过程中的进度,状态和异常.缓存.