2017-06-15 143 views
0

比方说,我必须提供我的网站,可以随时更新动态内容。我想要缓存数据以获得最佳性能。如何设置Cache-Control标题以缓存动态内容?

我认为最准确的做法是只要数据没有改变就将数据保存在缓存中。所以它涉及到使用no-cache选项。

问题是我不知道这是否是一个不错的选择。每次有人请求这些数据时,缓存服务器都会请求原始服务器,并询问自那时起数据是否已更改。所以我不知道no-store选项的差别在哪里,数据根本没有被缓存(就性能而言)。我的意思是,我认为bandwitdh卷将用相当的方式相当(我是对吧?)

因此,如果每个单一时间的请求,我的缓存服务器必须检查源服务器,所以什么是与直接请求源服务器的区别?

是否有任何选项可以设置缓存,以便只在发生更新时才能获取新数据?

回答

0

ETags是一种方法。如果你可以用你的动态内容的合理的短,唯一的字符串相关联,那么你可以使用该标识在HTTP响应头:

Cache-Control: public, must-revalidate, max-age=60 
ETag: <content identifer> 

这是很重要的内容标识符,从而例如使用改变其内容的变化,内容的十六进制编码哈希将工作。随后,客户端将通过一个GET请求发送的In-None-Match头使用的ETag:

If-None-Match: <previous etag> 

服务器应该发送304未修改响应,如果内容的ETag的没有改变,或发送一个完整200 OK的反应与更新的内容和一个新的ETag,否则。

支持服务器上的If-Modified-Since标题的另一选项。此标头允许客户端仅在指定日期之后修改内容时才请求内容,否则服务器应返回304 Not Modified响应而没有内容。

+0

感谢这就是我一直在寻找。你认为这些解决方案能否给我带来与制作“基本缓存”相同的优势,还是会使用一些额外的bandwitdh? – Jack

+0

头允许浏览器管理自己的缓存,你不应该需要任何东西。发送的HEAD请求的开销很小,以检查内容是否仍然有效,但这些都是最小的,并且可能是新内容下载时总带宽的一小部分。你可以通过调整'Cache-Control'头部来修改客户端检查更新的频率 - 例如在'最大年龄= 60'选项说的内容被视为新的5分钟 - 见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control了更多的选择。 –

+0

请注意,大多数HTTP客户端在发送完整的GET请求之前不会发送HEAD请求,因为它具有已知的资源实体标记。它只会发送带有'If-None-Match'头部的GET。 – idbehold