Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从RESTful服务缓存搜索结果的优雅方法?_Javascript_Search_Rest_Caching - Fatal编程技术网

Javascript 从RESTful服务缓存搜索结果的优雅方法?

Javascript 从RESTful服务缓存搜索结果的优雅方法?,javascript,search,rest,caching,Javascript,Search,Rest,Caching,我有一个RESTful web服务,我使用JavaScript从浏览器访问它。例如,假设此web服务在我向/messages/me发送GET请求时返回分配给我的所有消息资源的列表。出于性能原因,我希望缓存此响应,这样我就不必每次访问ManageMessages网页时都重新获取它。缓存的响应将在5分钟后过期 如果消息资源是“在我背后”创建的,比如说由系统管理员创建的,那么在缓存的搜索响应过期并重新获取之前,我可能在5分钟内不知道它。这是可以接受的,因为它不会让我感到困惑 然而,如果我创建了一个新的

我有一个RESTful web服务,我使用JavaScript从浏览器访问它。例如,假设此web服务在我向/messages/me发送GET请求时返回分配给我的所有消息资源的列表。出于性能原因,我希望缓存此响应,这样我就不必每次访问ManageMessages网页时都重新获取它。缓存的响应将在5分钟后过期

如果消息资源是“在我背后”创建的,比如说由系统管理员创建的,那么在缓存的搜索响应过期并重新获取之前,我可能在5分钟内不知道它。这是可以接受的,因为它不会让我感到困惑

然而,如果我创建了一个新的消息资源,我知道它应该是搜索响应的一部分,当它没有立即出现在我的“管理消息”页面上时,它就会变得混乱。通常,当我故意创建/删除/更新使缓存的搜索响应无效的资源时,我需要立即使缓存的响应过期/刷新

我想不出的核心问题是:

我看不到将创建/删除/更新资源的任务与使适当的缓存响应过期的任务连接起来的简单方法。在本例中,似乎很简单,只要创建/删除/更新(ny)消息资源,就可以手动使缓存的搜索响应过期。但在一个更复杂的系统中,跟踪哪些搜索响应在什么情况下过期很快就会变得笨拙。

引用菲尔·卡尔顿的话:“计算机科学中只有两个难题:缓存失效和命名。”


如果您使用的是全面的数据访问层,那么这将是处理缓存失效的地方(尽管这仍然不容易)。您只需在保存邮件的逻辑中加入一些缓存失效逻辑,这样它就可以清除邮件受让人的搜索缓存。

最简单的解决方案是使用服务器端缓存(例如,EhCache):)
您在一致性(因为您不需要对JavaScript进行更改)和过期方面的问题会少一些。

使用
E-Tag
(如果没有匹配的话)
,以确保客户端始终访问最新的信息

不利的一面是,您总是会打电话给服务器,以了解是否有任何变化。如果没有任何更改,整个消息将不会重新传输,在这种情况下,服务器将/应该简单地用
304 not Modified
响应进行响应。如果内容已更改,则新消息将作为响应发送

如果服务器响应良好(10-50毫秒),那么大多数延迟良好(50-500毫秒)的用户应该看不到明显的差异


这会增加服务器上的负载,因为它必须为每个请求验证接收到的电子标签是否与该资源的当前电子标签匹配。客户端从不认为资源是有效的/过时的/过期的,它们总是ping服务器并找出答案。

当您对从中获取的相同URI进行POST时,浏览器缓存应自动使缓存无效。请参阅文章,特别是关于失效后的部分。

ha,喜欢这句话。我周围的人都知道,我最大的抱怨之一就是给事物命名这种缓存的东西(我故意避免了很长一段时间)很快就排在了第二位。@Paul如果你不喜欢DAO中有一个需要失效的不同缓存的列表,你可以改为设置某种类型的事件系统。然后,您可以配置缓存层以侦听适当的事件,并根据需要决定是否使其无效。显然,对于单个缓存来说,这么多的工作并不是真正合理的,但是如果您在10个不同的地方缓存消息信息,它会有回报。ETag不会让我省去访问服务器的时间——这是我认为我真正想要的——但它很简单,而且可能不是一个坏方法。我将专注于降低与我的PHP服务器(bleh)相关的每请求启动成本,也许这与etags结合起来会足够有效。我们在各种移动应用程序中使用了电子标签,它在那里工作得非常好,尤其是在连接不太好的情况下。服务器必须像你说的那样进行高度优化。如果像在常规请求中一样生成整个响应,那么收益将显著下降。服务器端缓存和缓存失效可以很好地处理电子标签。