3

我正在建立一个网站来展示产品和产品类别。数据来自一个 500k XML 文件形式的外部服务。该网站是 ASP.NET,C#。

XML 被结构化为类别列表。每个类别内可能有一些产品和/或更多类别。

显然,我们无法调用这个外部服务来获取每个页面请求的大 XML 文件,所以我们每隔几个小时调用一次并缓存它。我需要做这样的事情:

  • 在页面左侧显示产品类别菜单
  • 显示选定类别中的所有产品
  • 显示单个产品的扩展信息

我的问题如下:

首先,在显示“DVD”类别中所有产品的页面上,假设我执行以下操作(在页面加载时):

XDocument allCategories = Cache["CategoriesXml"];
// loop through the XML and find the DVD category
// Get all products under it, then display them

通过将类别 XML 放入一个局部变量(记住,它是 500k),这是否会消耗服务器?请记住,每次加载页面时我都必须这样做。可能有成千上万的人同时查看不同的页面。如果一千个人在几秒钟内加载同一个页面,我会在内存中保留一千个这个 XML 文件的实例吗?或者垃圾收集器会为我管理所有这些吗?

直接循环缓存项目是否更好,还是性能较差(和/或不好的做法)?

其次,我说我缓存了整个 XML 文件。我通过循环从该 XML 中获取产品或类别(我使用 LINQ over XML)。创建 Category 类型和 Product 类型,将它们放入数组并缓存它会更好吗?然后循环通过 Category 对象和数组而不是 XDocument?什么会更高效?

第三,就如何构建该系统而言,您会说什么是最佳实践。假设我有一个数据访问层、一个业务对象层和 Web 应用程序。我应该把对外部服务的引用放在哪里来检索 XML?我应该缓存哪一层?这个应用程序是否有数据访问层,从某种意义上说,DAL 部分是由其他系统完成的?目前我的 DAL 仅用于访问我们的数据库,在其中放置 web 服务引用感觉不对 - 但也许不是?在业务层中使用缓存是不好的做法(即干扰单元测试等)?我已经考虑了 Web 和业务层之间的中间层,仅用于缓存 - 这是一个好主意还是坏主意?

实际上,我已经完成了这个网站的大部分内容 - 我现在只是回顾它,想知道我是否以最好的方式完成了它,所以想将您的建议与我实际所做的进行比较,希望我会能够回去改进它。

谢谢!

4

1 回答 1

3

我已经做了类似的事情,我会把你的缓存逻辑放在你的数据层中。这将从您的业务和表示层中删除所有缓存逻辑。

我不熟悉 ASP.NET,但我的猜测是肯定的,每个页面请求都会导致 XMl 文件被单独加载。

而且我不会将 XML 存储在内存中。您应该将所需的数据存储在内存中。可能有 ASP.NET 库用于使用内存缓存,例如 Memcached,您可以在其中存储对象的序列化版本。

于 2008-12-14T01:05:20.913 回答