是否有任何asp.net数据缓存支持缓存条目的背景数量?

Yel*_*fog 9 asp.net caching

我们有一个数据驱动的ASP.NET网站,该网站使用标准模式进行数据缓存(此处从MSDN改编):

public DataTable GetData()
{
   string key = "DataTable";
   object item = Cache[key] as DataTable;
   if((item == null)
   {
      item = GetDataFromSQL();
      Cache.Insert(key, item, null, DateTime.Now.AddSeconds(300), TimeSpan.Zero;
   }
   return (DataTable)item;
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是对GetDataFromSQL()的调用是昂贵的,并且该站点的使用相当高.因此,每隔五分钟,当缓存下降时,该站点变得非常"粘滞",而许多请求正在等待检索新数据.

我们真正想要发生的是旧数据保持最新,同时在后台定期重新加载新数据.(有人可能会因此看到的数据为六分钟之前的事实是不是一个大问题-数据不是那个时间敏感的).这是我自己可以写的东西,但知道是否有任何替代缓存引擎(我知道像Velocity,memcache这样的名称)支持这种情况会很有用.或者我错过了标准ASP.NET数据缓存的一些明显技巧?

Kel*_*sey 8

您应该能够使用CacheItemUpdateCallback委托,它是第6个参数,它是Insert使用ASP.NET Cache 的第4个重载:

Cache.Insert(key, value, dependancy, absoluteExpiration,
    slidingExpiration, onUpdateCallback);
Run Code Online (Sandbox Code Playgroud)

以下应该有效:

Cache.Insert(key, item, null, DateTime.Now.AddSeconds(300),
    Cache.NoSlidingExpiration, itemUpdateCallback);

private void itemUpdateCallback(string key, CacheItemUpdateReason reason,
    out object value, out CacheDependency dependency, out DateTime expiriation,
    out TimeSpan slidingExpiration)
{
    // do your SQL call here and store it in 'value'
    expiriation = DateTime.Now.AddSeconds(300);
    value = FunctionToGetYourData();
}
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

当对象在缓存中到期时,ASP.NET会使用缓存项的键以及您可能希望更新该项的原因来调用CacheItemUpdateCallback方法.该方法的其余参数是out参数.您提供新的缓存项以及刷新缓存项时要使用的可选过期和依赖项值.

如果使用对Remove()的调用显式删除了缓存项,则不会调用更新回调.

如果要从缓存中删除缓存项,则必须在expensiveObject参数中返回null.否则,使用expensiveObject参数返回对新缓存数据的引用.如果未指定到期或依赖项值,则仅在需要内存时才会从缓存中删除该项目.

如果回调方法抛出异常,ASP.NET将禁止该异常并删除缓存的值.

我没有对此进行过测试,因此您可能需要稍微修改它,但它应该让您基本了解您要完成的任务.