我们有一个数据驱动的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;
}

这样做的麻烦在于,对GetDataFromSQL()的调用非常昂贵,并且该站点的使用率很高。因此,每隔五分钟,当缓存丢失时,站点将变得非常“粘滞”,同时许多请求都在等待检索新数据。

我们真正想要发生的是使旧数据保持最新状态,同时在后台定期重新加载新数据。 (因此,有人可能会看到六分钟的旧数据这一事实并不是一个大问题-数据对时间不是很敏感)。这是我可以自己写的东西,但是了解是否有任何其他缓存引擎(我知道诸如Velocity,memcache之类的名称)是否支持这种情况将很有用。还是我在使用标准ASP.NET数据缓存时缺少一些明显的窍门?

最佳答案

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

Cache.Insert(key, value, dependancy, absoluteExpiration,
    slidingExpiration, onUpdateCallback);

以下应该工作:
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();
}

MSDN:



我尚未对此进行测试,因此您可能需要对其进行一些修改,但是它应该为您提供了有关要完成的工作的基本概念。

关于asp.net - 是否有任何asp.net数据缓存支持缓存条目的后台填充?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3382765/

10-13 07:37
查看更多