2009-07-16 146 views
3

我有一个ajax应用程序,客户端可能会经常查找一堆数据(比如按键),数据在恶意进程的固定时间每天在服务器端更新一次或两次。为避免频繁访问服务器,我将数据存储在xml文件中,以便客户端首次加载时下载一次,然后通过javascript从本地数据文件查看数据。 但是,用户可能会在更改前加载页面,然后在不刷新页面的情况下开始使用页面,因此数据文件永远不会更新,因此不断告诉用户新数据不可用。 我该如何解决这个问题?缓存或不缓存

回答

3

你应该设置生成的XML文件中的相应的HTTP缓存头使过去的那个时候任何客户端请求将得到新版本并将其缓存在本地,就像其他任何静态内容一样。

+0

HTTP HEAD调用会为您提供最后修改的标头,您可以使用它来确定是否需要更新。 – 2009-07-17 06:08:54

0

如果数据加载不是很大......将数据作为XML岛包含在主文档中。无论是在文档生成(aspx,php等)中形成它,还是在加载时填充(通过ajax调用)保留的文档节点。这样,您的用户始终拥有最新的数据,您不必担心缓存问题,而且生活更简单。

如果它很大,请根据需要通过ajax调用填充该节点。

+0

当你说xml岛,你的意思是让XML数据和主要文件的一部分dom? 本例中的数据并不小(至少1mb) – user121196 2009-07-16 05:17:53

+0

这种技术的要点就是隐藏文档节点中的数据。不要担心具体使用XML。选择你自己的格式。(XML比其他一些格式更加冗长)。然而,术语'XML Island'是一个众所周知的模式,并且会引导您举出很多例子。 就数据而言... 1 MB数据在作为初始文档的一部分交付时并不那么大,因为大多数服务器都压缩请求的文档......特别是当用户仅在第一次加载时获取数据时。 祝您好运 – CMB 2009-07-16 06:28:52

0

一个明显的选择是添加一些AJAX轮询服务器每分钟。如果数据需要刷新,则只需在页面上明显显示非阻塞消息,通知用户新数据可用并提供刷新页面的链接。作为一个额外的你可能想要提供一个按钮,用户点击,如果他们想检查新的数据(而不是等待x分钟过去)本身。

如果您使用HEAD请求,您可以只检查最后修改的标题。

0

你说更新时间是固定的?因此,当用户在更新时间之前访问您的页面时,您可以为页面设置一个JavaScript变量,指示有多少分钟,例如,直到下一次更新,并运行客户端计时器,例如:

定时器= { 运行:函数(){ 如果(现+ minuteToUpdate>录入 - startVisitTime){

 // make ajax request here to update XML file 
    } 
}, 
interval: //you can determine this since this will run in client-side 

}

你不轮询此stiuation因为它是浪费,并强调称服务器每次。

您可以设置一些会话变量,以帮助这个运行更好,更准确地

贾斯汀

0

运行时说的话......

或者,由于更新时间是固定的,罕见的,那么当你为你的XML,还包括一个缓存过期时间为元素或自定义标题。这样,如果您的用户在XML更新前1分钟访问该站点,则可以编写客户端以使其缓存过期,并在1分钟后的下一个请求中更新自身。