在本地缓存XML Feed的最佳方法是什么?

时间:2010-08-10 08:58:37

标签: .net xml caching

我有一个XML Feed,其中包含1000多个属性记录(租金,销售)。

目前我在主页上调用此Feed 16x,只返回3个属性,用于特定条件,如3个新房,3个新房等,5个推荐房屋,5个推荐单位等。

此方案在7个月内运作良好,同时有200多个属性,每天只有100-200个视图。它现在已经到了我每天有超过700次访问和超过1000多个属性的阶段,并分别下载16个提要只是为了显示主页变得越来越慢,流量也越来越大。

因此我想缓存这些流,我希望只有我的'机器人'可以直接从源代码下载流,所有访问者都可以使用我的本地副本来更快地制作内容,并大量减少流量负载。

我在本地下载XML并在本地调用文件来显示数据时没有问题。但我想知道如何解决可能的问题,如:

  • 未向客户端显示数据,因为机器人正在更新XML文件,原始文件将被覆盖并在加载新数据时为空
  • 使用XML文件作为本地备份,意味着如果源服务器处于脱机状态,主页仍将正常工作并加载
  • 确保我不会以机器人无法更新文件的方式锁定客户端的数据

我的第一个难点是为每个流使用2个xml文件,一个将显示给客户端,另一个将被下载。如果下载正确,则下载的XML将用作实时数据,而其他XML将被删除。某种增量标记,其中一个文件用作保存实际数据名称的文件。

有没有办法如何缓存这些XML文件,以便它可以做类似的事情?真正的主要问题是要有防弹解决方案,以便客户不会看到错误页面或空结果。

感谢。

2 个答案:

答案 0 :(得分:1)

使用HttpWebResponse中内置的缓存选项。这允许您以编程方式选择直接从缓存中获取(忽略新鲜度),忽略缓存,强制刷新缓存,强制缓存重新验证以及使用缓存的正常行为(如果根据原始响应的年龄被认为是新鲜的)信息,以及重新验证它。

即使您确实需要超出特定的缓存要求,也要在正确执行HTTP缓存的基础上构建它,而不是作为完全替代。

如果你确实需要管理你自己的XML流缓存,那么正常的文件锁定,如果真的有必要,.NET ReaderWriterLockSlims应该足以让不同的线程互相搞乱。消除过高争用风险的一种可能性是在高速缓存争用的情况下默认为直接访问。考虑到缓存最终是一种优化(从概念上讲,您从服务器获取文件,缓存只是以更有效的方式实现)。因此,如果您无法快速获得读锁定,则可以直接恢复下载。这反过来减少了写锁定可能发生的等待(因为在请求写锁定时,挂起的锁不会随着时间的推移而堆积)。在实践中,它可能不会经常发生,但它可以避免在一个文件周围建立不可接受的争用并使整个系统崩溃的风险。

答案 1 :(得分:0)

我将首先假设您不拥有生成源XML Feed的代码?因为如果你这样做,我会考虑为你想要运行的查询添加一些特定的支持。

我遇到了与第三方Feed相似的问题,并构建了一个每天运行几次的作业,下载Feed,解析它,并将结果存储在本地数据库中。

每次更新数据库时都需要进行一些比较,只需添加新记录并删除旧记录,但它确保始终有数据提供给客户端,数据库可以解决文件等简单问题锁定。

然后我会看一个简单的服务层来公开本地商店中的数据。