【发布时间】:2011-05-12 21:46:25
【问题描述】:
这是背景,我有一个来自供应商/合作伙伴的 Web 服务,它返回我用来显示数据的大型 XML 文档。很简单。问题是该服务需要几分钟才能执行。供应商在一个方法调用中将整个规范化数据库作为 XML 文档返回,而且速度很慢。愚蠢的供应商,但我无法控制。
我有两个问题:
在哪里缓存它?磁盘、数据库、内存(我倾向于将其放在磁盘上。它太大且无法访问到足以存储在内存中。将它放在数据库中可能正确,但我不想编写 ETL 并在某处运行作业。)
如何缓存它?我不能让它过期并让下一个请求刷新缓存,因为它需要很长时间。我需要在缓存重建时提供陈旧的数据。我可以想到几种方法,但没有一种方法看起来简单或非常优雅。我想做一些简单的事情;我不是在寻找有史以来最好的工程解决方案。
这是我的计划...请告诉我我是个白痴,并提出一些我忽略的更简单的建议。
- 将 XML 写入磁盘
- 同时将文件名和某种过期炸弹写入缓存(显然文件名不会过期很长时间)
- 在我的工作线程中,尝试从缓存中读取我的炸弹
- 如果缓存过期(我的炸弹爆炸了)然后生成一个线程来获取并保存 XML
- 同时,从缓存中获取文件名并在构建新 XML 时读取旧 XML
- 当新文件完成后,从缓存中过期旧文件名并将文件名写入缓存
这对我来说听起来很荒谬,必须有更好的方法。
我正在使用 .Net 和 IIS6,如果需要,我可以将 XML 粘贴到 SQL Server 中。
【问题讨论】:
-
为什么不能将这些数据存储在内存中?您要存储的对象有多大?
-
为什么你不能只延长 iis 的连接超时时间,以便有足够的时间下载整个文件?这个文件到底有多大?!
-
该对象有几 MB 大小,我承认它并不大,但它的访问频率也不够高,以至于我想将它缓存在内存中。我已经考虑过接受打击,我仍然可能会朝那个方向发展。我已经更改了超时,但我不能让用户等待 90 秒来呈现数据,所以我需要在缓存重建时为用户提供一些服务。