【发布时间】:2011-03-23 21:41:49
【问题描述】:
我们有一个数据驱动的 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() 的调用很昂贵,并且该站点的使用率很高。因此,每五分钟,当缓存下降时,网站就会变得非常“粘滞”,而大量请求正在等待检索新数据。
我们真正想要的是让旧数据保持最新状态,而新数据会在后台定期重新加载。 (因此有人可能会看到 6 分钟前的数据这一事实并不是什么大问题 - 数据不是 时间敏感的)。这是我可以自己编写的东西,但是了解是否有其他缓存引擎(我知道 Velocity、memcache 之类的名称)是否支持这种情况会很有用。还是我错过了标准 ASP.NET 数据缓存的一些明显技巧?
【问题讨论】:
-
分析您的 GetDataFromSQL 调用并找出其中的哪些部分很慢可能是值得的。它很可能遵循顶叶原则(即 80% 的减速是由 20% 的代码造成的)。然后,您可以将精力集中在导致大部分速度下降的那 10% 或 20% 的代码上。
-
分析将使您更好地了解数据使用模式。这应该允许您只缓存那些变化不大的东西。否则,您可能会花费大量时间在后台填充很少使用的缓存条目,这实际上可能会降低性能。
-
感谢您的这些想法。但是:a)有各种背景原因,这意味着调用目前仍然很昂贵,并且 b)我认为无论调用费用如何,后台加载模式在这些情况下实际上是架构上最好的。
-
@Robert:帕累托原则? en.wikipedia.org/wiki/Pareto_principle