大型XML文件的体系结构和缓存注意事项

大型XML文件的体系结构和缓存注意事项,xml,architecture,caching,data-layers,Xml,Architecture,Caching,Data Layers,我正在建立一个网站来展示产品和产品类别。数据来自外部服务,格式为500k XML文件。该网站是ASP.NET,C# XML的结构是一个类别列表。每个类别内可能有一些产品和/或更多类别 显然,我们不能调用这个外部服务来获取每个页面请求的大XML文件,所以我们每隔几个小时调用一次并缓存它。我需要这样做: 在页面左侧显示产品类别菜单 显示选定类别中的所有产品 显示单个产品的扩展信息 我的问题如下: 首先,在显示“DVD”类别中所有产品的页面上,假设我执行以下操作(页面加载): 通过将类别XML引入

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

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

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

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

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

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

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

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

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

事实上,我已经完成了这个网站的大部分内容——我现在只是回顾一下,想知道我是否用了最好的方法,所以我想把你的建议和我实际做的做一比较,希望我能够回去改进它


谢谢

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

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


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

+1。您甚至可以添加另一个抽象级别,使缓存成为缓存的直通,我已经看到了。好处是,缓存传递可以编写为与多个DAL一起使用(用于多个应用程序)。@Joseph:你说的“使缓存成为缓存的传递”是什么意思?你能用一个例子解释一下吗?是否愿意在回顾时回答你自己的问题?:)哪种解决方案最适合您?
XDocument allCategories = Cache["CategoriesXml"];
// loop through the XML and find the DVD category
// Get all products under it, then display them