缓存还是不缓存

3
我有一个ajax应用程序,客户端可能经常查找大量数据(例如按键),数据在服务器端由一个守护进程在固定时间每天更新一两次。为了避免频繁访问服务器,我将数据存储在一个xml文件中,因此客户端在页面首次加载时只需下载一次,然后通过javascript从本地数据文件查找数据。 但是用户可能会在更改之前不久加载页面,然后开始使用它而没有刷新页面,因此数据文件永远不会更新,因此告诉用户新数据不可用。 如何解决这个问题?
5个回答

3

您应该为生成的XML文件设置适当的HTTP缓存头,这样任何在此时间之后的客户端请求都将获得新版本并在本地进行缓存,就像其他静态内容一样。


使用 HTTP HEAD 调用将获取最后修改的标头,您可以使用它来确定是否需要更新。 - Drew Stephens
我该如何在服务器端设置适当的HTTP缓存头以针对XML文件?这是否意味着XML文件必须通过动态服务器代码提供服务? - user121196
此外,HTTP HEAD 调用是否通过 JavaScript 完成?你能提供一些详细信息吗? - user121196
由于您每天更新XML两次,我建议通过http处理程序提供服务,并将其设置为每12小时过期一次(假设更新每12小时进行一次)。通过“js完成的http调用”,我认为您的意思是在客户端代码中进行一些ajax调用以请求该xml,因此,是的,它将在客户端下载并缓存以供未来12小时内的进一步请求使用。 - user134706
不需要HTTP HEAD,因为在未修改的情况下,它与从GET接收304一样快,并且在需要从GET接收200时更快,因为它跳过了从HEAD接收的步骤。 - Jon Hanna

0

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

timer = { run:function () { 如果(now + minuteToUpdate > updateTime-startVisitTime){

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

}

在这种情况下不要进行轮询,因为每次调用服务器都会浪费时间和造成压力。

您可以设置一些SESSION变量来帮助程序更好、更准确地运行。

Justin


0
如果数据负载不是很大... 将数据作为XML岛屿包含在主文档中。可以在文档生成(aspx、php等)时形成,也可以在加载时通过ajax调用填充保留的文档节点。这样,您的用户始终拥有最新的数据,您不必担心缓存,生活会更简单。
如果数据负载很大,则根据需要通过ajax调用填充该节点。

当你说XML岛时,你是指将XML数据和主文档的一部分制作成DOM吗?在我的情况下,数据不小(至少1MB)。 - user121196
这项技术的要点就是将数据隐藏在文档节点中。不需要特别使用 XML,可以选择自己喜欢的格式。(相比于其他格式,XML 的语法更冗长)然而,“XML Island” 这个术语是一个众所周知的模式,会带领你找到许多例子。至于数据...当作为初始文档的一部分交付时,1 MB 的数据并不算大,因为大多数服务器会压缩请求的文档……特别是当用户仅在首次加载时获取数据时。祝好运 - CMB

0

一个明显的选项是添加一些 AJAX,每隔 x 分钟轮询服务器。如果数据需要刷新,只需在页面上某个明显的位置显示一个非阻塞消息,通知用户有新鲜数据可用,并提供一个链接来刷新页面。作为额外的功能,您可能希望为用户提供一个按钮,让他们自己检查新鲜数据(而不是等待 x 分钟过去)。

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


0

运行时说...

或者,由于更新时间是固定的且不频繁,因此在提供XML的同时,还可以将缓存过期时间作为元素或自定义标头包含其中。这样,如果用户在XML更新的1分钟之前访问网站,则可以编写客户端以使其在超过该1分钟标记后进行缓存过期并在下一次请求之后更新。


这意味着XML文件必须由服务器代码提供并在发送XML数据之前发送到期标头,是吗?我能从客户端(JavaScript?)获得到期标头吗?为什么需要将缓存过期时间作为元素或自定义标头? - user121196
您需要将缓存过期时间作为自定义标头或正常XML响应中的元素返回,以便JavaScript可以使用它。是的,在JavaScript中可以从AJAX请求获取标头。 - Justin Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接