在内存中存储数据:会话与缓存与静态

时间:2009-01-30 18:20:38

标签: memory session caching static

有点背景故事:我正在开发一个Web应用程序,需要花费大量时间来准备/处理数据,然后再将数据提供给用户进行编辑/操作。数据请求任务完成约15/20秒,处理几秒钟。在那里,用户可以动态操纵vaules。任何值的操作都需要对数据进行完全重新处理。

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

为了提高效率,我将初始数据移动到内存中并使用Ajax调用回服务器,这样我就可以缩短处理时间来处理用户更新时发生的重新计算。

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

此外,用户可能会在此过程中工作几个小时。当用户使用数据工作时,如果会话以某种方式中断,我将需要某种故障保护来保存用户的当前数据(在数据库或序列化二进制文件中)。换句话说,我需要一个具有适当钩子的解决方案,以允许我在用户断开连接/分心太久的情况下转储内存对象的数据。

到目前为止,这是我的想法:

会话状态 - 优点:锁定给一个用户。 Session End事件是否符合我的故障安全要求。缺点:我当前选项的最慢性能。 Session End事件有时很难确保它正确触发。

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

静态 - 优点:最佳性能。易于维护,因为我可以直接利用我当前的类结构。缺点:除了基于时间间隔的写入之外,没有简单的故障保护步骤。全局范围 - 必须确保用户不会相互冲突。

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

谢谢!

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

6 个答案:

答案 0 :(得分:2)

我会投票给秘密选项#4:为此使用数据库。如果你谈论数据的周转时间超过20秒,那么考虑到你提出的选项的限制,你不会通过尝试在内存中做到这一点来获得任何收益。你也可以在数据库中设置它(给它一个自己的表,如果需求那么大,甚至是一个单独的数据库)。

答案 1 :(得分:0)

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

简单地说,让用户“命名”数据集,并自动或通过像“保存”按钮这样简单的东西,为用户主动持久保存数据集。

您不能仅仅因为它(通常)与用户浏览器实例绑定而依赖会话。如果他们不小心关闭浏览器(单击X按钮,他们的PC崩溃等),他们就会失去所有的工作。哪个会讨厌。

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

答案 2 :(得分:0)

我认为你几乎已经用优点/缺点回答了你的问题。但是,如果您正在寻找一些同行验证,我的投票是针对会话。虽然性能较慢(你知道慢多少吗?),但你的处理需要很长时间。你认为用户会知道15秒到17秒之间的差异吗?两者在网络术语中都是“永远”的,所以请选择最容易实现的方法。

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

看看这篇文章,如果它没有意义,请回复我。

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

答案 3 :(得分:0)

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

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

这允许用户离开,返回,甚至重新启动浏览器并在她对结果感到满意时提交。

答案 4 :(得分:0)

我会使用缓存方法在任何页面加载中存储数据。您可以命名要存储数据的缓存,以避免冲突。

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

可以调整其中的第一部分以错开更多写入:保存对Session的更改,然后每隔一段时间将其写入文件,然后以更大的间隔扫描文件。您可以将其调整为性能,并选择可能的用户更改损失级别。

答案 5 :(得分:0)

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

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