2010-03-15 46 views
0

我问一个问题了一段时间回来就在这里就为日历/调度Web应用程序的缓存数据,并得到了一些良好的反应。然而,我现在决定改变我的方法和统计数据缓存在JavaScript中。缓存的问题使用JavaScript和asp.net

我直接缓存在$(“身体”)内的日历网格每天的列中的HTML。数据()对象,这给了非常快速的网页加载时间(几乎是容易被忽视的)。

然而,问题开始当用户请求数据尚未在高速缓存中出现。这些数据是由服务器使用ajax调用创建的,因此它是异步的,每周数据大约需要0.2s。

我目前的做法是,当用户从服务器请求信息,并在初始页面加载时缓存4周(每页更改请求额外增加1周)时,阻止0.5s,但是我怀疑这是最佳方法。

有没有人有一个建议就如何改善这种状况?

总结:

  • 每个星期需要0.2秒,从服务器中检索,异步。
  • 性能必须尽可能接近实时。 (但是不需要数据是完全实时的:大多数任命都是由用户添加的,所以我们可以重新缓存在此之后)
  • 目前4周缓存上加载inial一周的两侧:这是不够。
  • 缓存1年花费〜21S,这是初始加载速度太慢。

+1

这可能是OT,并且*不会*以任何方式表现出来:对服务器端时间有什么可以做的吗?我很惊讶你会在0.2秒内回到一周,但两周需要〜0.4秒。我希望在大多数后端情况下,两周的时间几乎与一周时间一样多,其中大部分时间都是设置请求,检查数据库池中的连接或其他等等,而不是实际的查询。但是,再次,这可能是OT,并且当然*基于您对基础设施的无知。 :-) – 2010-03-15 13:04:35

+0

是的,我认为需要更多关于你在服务器上做什么的信息。你的放缓在哪里?通常它在数据库中,当然,但也许是别的。 – WVDominick 2010-03-15 13:13:24

+0

不,这是一个公平的评论:我实际上拿出了传输时间(包括它们在内的接近0.5):我不想指望传输速度:这是在我的本地ASP.net开发环境中运行(在调试),所以不能保证一旦他们在现场服务器上,它们将保持不变,尤其是因为现场设置是负载均衡的,并且由于路由等原因而具有可变的性能。20年的数字为一年与转移包括在内。我会更多地考虑一周需要0.2秒才能从数据源转换为HTML。 – 2010-03-15 13:15:59

回答

2

当我阅读你的描述时,我想到了两件事:异步和缓存。

首先,异步性

你为什么要阻止0.5秒?为什么不使用ajax调用,并在回调中使用检索到的信息更新页面。在设定的时间内没有阻塞,它是异步完成的。尽管您不得不抑制多次点击,但请求仍然存在,但这根本不应该成为问题。

您还可以在后台使用setInterval或更高版本,setTimeout预加载页内缓存。如果计算或生成日历的开销很大,并且数据量相对较小 - 换句话说,即使从未使用,也足够小到可以在页内缓存中存储数月,这一点尤其有意义。听起来你可能会这样做,只需要在用户跳出缓存数据范围时阻止。

智能高速缓存

我想象的回调函数 - Ajax调用完成时被调用的一个 - 将检查当前选定的日期是在高速缓存数据的“边缘” - 无论是第一周缓存或上周(或其他)。如果用户处于边缘,那么回调可以发出额外的请求来乐观地预加载缓存至4周的限制,或者任何时间范围对于80%的用例都有意义。

您也可以考虑在每个用户的基础上,将生成的日历数据缓存在服务器端的上。如果生成这些东西需要CPU和时间密集型处理,那么一次生成并将其保存在服务器端缓存中应该是一笔不错的交易,只有在用户进行更新时才会失效。使用x64服务器和便宜的内存,这可能是非常可行的。根据使用情况,它可能会提供更多可用的交互,这是用户第二次连接到应用程序。您甚至可以考虑在用户请求任何日历之前以每个用户为基础预加载服务器端缓存。

+0

异步:是的,我实际上使用页面方法的回调重新调用缓存,它似乎工作正常。我阻止使用UpdatePanel,因为它更容易确保用户在请求帖子发布时不能点击任何内容,并保证该周快速周转。至于智能缓存,由于没有足够的时间来执行检查并获取数据,所以很难处理用户试图通过重复点击“下一步”按钮导航到特定周的情况。 – 2010-03-15 17:11:55

+0

对于服务器端的缓存,在组环境中并不是真的可行,很有可能让另一个用户在他们注销时甚至在他们登录时更改他们的约会。如果它是纯粹的客户端,当它们再次加载页面时会刷新,这将确保数据始终保持新鲜。 – 2010-03-15 17:13:17

+0

关于“时间不够”的问题。 。 。有办法可以智能地处理它。一种方法是通过setTimeout在click和产生的ajax调用之间引入延迟。如果在延迟过期之前发生额外的点击,则重置计时器并等待更多。您可以假设多次下一次点击会在对方650毫秒内发生,例如,如果您连续获得三次点击,然后延迟超过650毫秒,则您需要在3周后申请,而不是“此星期“,”下周“和”接下来的一周“,并有3个独立的ajax调用。 – Cheeso 2010-03-15 18:45:15