【问题标题】:cache data until changed缓存数据直到改变
【发布时间】:2012-08-02 19:59:35
【问题描述】:

我有一个旧网站,由于性能不佳,需要进行一些优化。这是一个以linq to sql为数据层,MVP模式为UI模式的asp.net购物网站。

数据库中成本最高的实体是具有一对多关系的产品和类别表。这两个实体可能不会定期更改,除非管理员组的用户决定添加产品或类别……等等。我想知道为每个请求从这两个实体创建和获取所有内容的资源成本是多少!所以如果我有办法让我的数据保持活力……

首先我想好了,让我们使用 AJAX 进行数据检索,因此我将只创建那些我需要查询或绑定到的实体,但是等等,如果不创建新的 DataContext 实例,我怎么能做到这一点?!! 另一方面,由于内存成本,对整个 DataContext 使用缓存被认为是一个糟糕的决定。那么这里最好的选择是什么?我该如何改进?

更新

1) 按照@HatSoft 的建议行事。

缺点:这些方法对您的代码没有帮助,只会对数据库有帮助。除此之外,由于我们将数据放入内存而不是呈现的 html,因此可能存在内存问题,但是这可能是解耦的最佳选择。

2) 使用输出缓存,我们在带有 *.aspx 通配符的 http 处理程序中拥有此代码:

string pagePath = Context.Request.Url.AbsolutePath;
object cacheKey = application[pagePath];
if(cacheKey == null)
  return; //application restarted/first run so cache the stuff
else
  Context.Response.RemoveOutputCacheItem(pagePath);

缺点: 现在我们应该将 pagePath 链接到页面使用的每个数据库实体,但如果我这样做了,那么我就是在耦合事物而不是去耦合它们。这种方法也会遇到一些硬编码。

3) 另一种解决方案是在后缓存模式下输出缓存,而不是控制缓存模式。使用 Subsituation 元素并将 OutPutCache Duration 设置为 86400,以便每 24 小时重新创建一次页面。

缺点:硬编码用户控件以动态生成替代元素的 html 输出。

那你有什么建议?

【问题讨论】:

    标签: asp.net sql-server linq-to-sql webforms mvp


    【解决方案1】:

    使用 Linq2SQL,您可以使用 LinqToCache,它为您的 LINQ 查询提供 SqlDependency 驱动的缓存。它将IQueryable<Products> 转换为IEnumerable<Products> 并在第一次访问后枚举内存(底层IQueryable 的第一次迭代)。根据SqlDependency 数据更改通知,它使列表无效,后续访问将再次从数据库中查询,并缓存结果。

    我的建议是将产品列表和类别缓存在内存中,因为它们很少更改,而且我希望它们的大小相当有限。

    【讨论】:

    • 每次从内存缓存返回列表时,都会保存一个 DB 命中。
    • 1) 相同的数据可用于许多 HTML 输出(例如缓存类别列表,它用于 any 页面响应)。 2) 数据具有明确的过期语义(SqlDependency 将在任何后端更新 Categories 表时使缓存失效)。 3)您仍然可以缓存生成的HTML,以节省处理。
    • 每个缓存必须至少使用数据库一次,否则不是缓存。没有人提到SqlCacheDependency,我说SqlDependency。阅读rusanu.com/2006/06/17/the-mysterious-notification
    • 我有很多查询,其中一些违反了sql查询通知规则。我认为解决方案 3 在一些重构和应用单一职责方面非常好。你怎么看?
    【解决方案2】:

    我建议你看看 SqlDependency 类请阅读这篇文章http://www.asp.net/web-forms/tutorials/data-access/caching-data/using-sql-cache-dependencies-cs

    如果它适合您的应用程序,我还建议您在应用程序启动时将数据加载到缓存中。请在此处查看一个很好的示例http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-at-application-startup-cs

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2013-11-04
      • 2012-04-17
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多