2009-01-30 79 views
10

有点背景故事:我正在研究一个Web应用程序,在将数据提供给用户进行编辑/操作之前,需要花费相当多的时间准备/收集数据。数据请求任务~15/20秒完成并处理几秒。一旦出现,用户就可以随时操作虚拟键盘。任何值的操作都需要数据完全重新处理。将数据存储在内存中:会话vs缓存vs静态

更新:为避免混淆,我只进行1次数据调用(15秒命中),然后希望将结果保留在内存中,这样我就不必再次调用它,直到用户为100%完成了它的工作。因此,第一次拉动需要一段时间,但是,使用Ajax,我将打开内存数据来不断更新并保持响应时间大约2秒左右(我希望)。

为了提高效率,我将初始数据移动到内存中,并使用Ajax调用返回到服务器,以便减少处理时间以处理发生在此用户更新时的重新计算。

这里是我的问题,考虑到性能,假设只有1个用户将在任何给定时刻使用此数据,那么存储此数据的最佳方式是什么。

另外,用户可能会在这个过程中工作几个小时。当用户正在使用数据时,如果他们的会话以某种方式中断,我将需要某种故障安全来保存用户的当前数据(无论是在数据库中还是在序列化的二进制文件中)。换句话说,我将需要一个具有适当钩子的解决方案,以便在用户断开/分散时间过长的情况下允许我转储内存对象的数据。

到目前为止,这里是我的沉思:

会话状态 - 优点:锁定为一个用户。有会话结束事件将符合我的故障安全要求。缺点:我当前选项的表现最慢。会话结束事件有时很难确保它正确触发。

缓存 - 优点:良好的性能。有权访问依赖项,这些依赖项可能是后来的一项奖励,但在当前范围内并不真正有用。缺点:除了基于时间间隔的写入外,没有简单的故障保护步骤。全球范围 - 必须确保用户不会与对方的工作发生冲突。

静态 - 优点:最佳性能。很容易维护,因为我可以直接利用我目前的班级结构。缺点:除了基于时间间隔的写入外,没有简单的故障保护步骤。全球范围 - 必须确保用户不会与对方的工作发生冲突。

有没有人对我应该选择什么选项有任何建议/意见?

谢谢!

更新:忘了提及,我使用VB.Net,Asp.Net和Sql Server 2005来执行此任务。

+0

升级服务器通常比花时间优化代码更便宜。我相信杰夫阿特伍德最近在他的博客上谈到了这件事。 – Malfist 2009-01-30 18:27:13

+0

我想我应该更具体w/performance。我并不担心处理内存使用的服务器,而是需要多长时间才能将我的响应回复给用户。 – Nathan 2009-01-30 18:28:36

+0

您使用哪种语言/技术? – nlaq 2009-01-30 18:32:51

回答

0

我会采用缓存的方法来存储任何页面加载数据。您可以将要存储数据的缓存命名为避免冲突。

为了跟踪用户所做的更改,我会采用更老式的方法:每当用户进行更改时追加到文本文件,然后每隔一段时间扫描一次该文件以将更改保存回数据库。如果您根据用户/帐户或某个其他会话唯一指示器命名文件,则不存在冲突问题,并且应用程序(或其他支持应用程序,通常这可能是一个更好的主意)可以扫描所有这些文件并即使会话结束,也要更新数据库。

第一部分可以进行调整以更多地将写出错开:保存对会话的更改,然后将其间隔地写入文件,然后以较大间隔扫描文件。您可以将其调整到性能,并选择可能的用户变更损失水平。

0

使用会话,但不要依赖它。

简单地说,让用户“命名”数据集,并自动或通过简单的“保存”按钮等方式为用户积极持久保存。

您不能仅仅因为它(通常)绑定到用户浏览器实例就依赖于会话。如果他们不小心关闭浏览器(点击X按钮,他们的电脑崩溃等),那么他们将失去所有的工作。这将是讨厌的。

一旦用户对数据的“持久性”状态具有这种控制权,您可以依靠Session将其保存在内存中并将其用作缓存。

0

我想你几乎只是回答你的问题与利弊。但是,如果您正在寻找同行验证,我的投票将用于本次会议。虽然性能较慢(您是否知道速度较慢?),但无论如何,处理过程都需要很长时间。你认为用户会知道15秒和17秒之间的差异吗?两者都是以网络术语来说是“永远”的,所以请使用最容易实现的方法。

也许有点偏题。我建议将这些长处理调用放在异步中(不要与AJAX的异步页面混淆)。

看看这篇文章,如果没有任何意义,请回我一下。

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

2

我会投票给秘密第4个选项:使用数据库这一点。如果您正在谈论数据的20秒以上的周转时间,考虑到您提供的选项的限制,您不会因尝试在内存中执行此操作而获得任何收益。你可以在数据库中设置它(给它一个自己的表,或者如果需求量很大的话,甚至是一个单独的数据库)。

0

我建议在向用户发送初始结果时,在新的数据库表中创建一份数据(我们称之为EDIT)。如果性能问题,请在后台线程中执行此操作。

随着用户编辑数据,更新表(如果性能成为问题,也在后台线程中)。如果必须使用线程,则必须确保在开始更新行之前第一个线程已完成。

这允许用户走开,回来,甚至重新启动浏览器,并提交每当她感到满意的结果。

0

其他人提到的一种可能的替代方法是将数据存储在客户端上。 假设数据集不是太大,并且操纵它的代码可以在客户端处理。您可以将数据存储为XML数据岛或JSON对象。然后可以操纵/处理这些数据并处理所有客户端,而不需要往返服务器。如果您需要将这些数据保存到服务器,那么最终的数据可以通过AJAX或标准回发发布。

如果这不符合您的要求,我会把它存储在SQL服务器上,如其他评论建议。