2011-11-17 50 views
1

我们正在构建一个基于Java的内部RESTful Web服务应用程序,该应用程序以XML格式公开特定于域的数据。我们希望通过利用缓存存储来补充架构并提高性能。我们希望将缓存托管在独立但共存的服务器上,并且由于Web服务是Java/Grails,缓存中的Java或HTTP API将是理想的。什么是合适的存储RDBMS,NoSQL,用于缓存网站响应?

由于请求进来,独特的URI和他们的反应会使用简单的键/值约定缓存,例如...

KEY           VALUE 
http://prod1/financials/reports/JAN/2007 --> XML response of 50Mb 
http://prod1/legal/sow/9004    --> XML response of 250Kb 

单个请求的响应值可以说是相当大的,也许起来到200Mb,但可能小到1Kb。而且每天的请求数量很少;不超过1000,但平均为250;我们没有大量的消费者;再次,它是一个内部应用程序。

我们开始将MongoDB视为潜在的缓存存储,但鉴于MongoDB的最大文档大小为8或16Mb,我们并不认为这是最合适的。

根据我提供的有限的细节,在这种情况下可能适合其他类型商店的任何建议?

+0

50MB响应?分页是一个选项吗?这种情况有一个代码味道它IMO。 – lobster1234

+0

不是,这是一个系统到系统的交互,而不是用户到系统。 – user646584

回答

1

我理解你的问题的方式,你基本上想要缓存文件,即你不需要了解文件的内容,对吧?

在这种情况下,您可以使用MongoDB的GridFS将xml缓存为文件。这样,您可以平滑地将文件流入和流出数据库。你可以使用URI作为'文件名',那么应该做这个工作。

没有(合理的)文件大小限制,并且大多数(如果不是全部)驱动程序都支持它。

+0

是的,没错,反应是任意的。不知道GridFS ......那些利用内存而不是磁盘的缓存存储呢?我们应该看看Memcached吗? – user646584

+0

MongoDB是以内存为中心的,并试图尽可能多地保留内存。总的来说,我认为缓存几百MB的文件是一个相当不寻常的要求,我相信MongoDB可以完成这项工作。可能还有其他选项,可能包括memcached,但我对任何一个都不熟悉。 – mnemosyn

+0

我只是好奇,如果GridFS使用内存尽可能多的非GridFS使用....只是为了清楚文件缓存,并不是说我们缓存物理文件,一个100MB +的响应可能来自多个数据源的聚合,并且加入那么多的数据需要时间,所以缓存结果对于后续请求通过避免聚合步骤。 – user646584

0

这里最简单的解决方案只是缓存这些数据在文件系统中。如果您希望缓存的大小大于您的内存,可以使用tmpfs确保所有内容都位于主内存或任何常规文件系统中。不要担心,即使在后一种情况下,操作系统内核也会高效地缓存主内存中经常使用的所有内容。如果您使用的是Linux,仍然必须通过cron删除旧文件。

这似乎是一个老派的解决方案,但它可能更容易实现,并且比其他许多人更容易出错。