以下问题是关于为以下所述的REST启发的行为实现或已经存在的缓存框架。
目标是应该像对静态页面的请求一样有效地处理GET和HEAD请求。
在技术方面,我想到Java Servlets和MySQL来实现这个网站。 (但出于好的理由可能仍会影响我对技术的选择。)
网页应该支持GET,HEAD和POST; GET和HEAD比POST更频繁 。只有POST才能使用GET / HEAD更改页面内容。因此,我想直接从文件系统提供GET和HEAD请求,并且只需要来自servlet的POST请求。
在后续的一轮改进中,为了节省带宽,缓存的HTML文件也应该以gzip-ed版本提供,该版本在客户端理解时提供。我相信基本机制应该与未压缩的HTML文件相同。
由于会有许多类似REST的页面,因此这两种方法可能偶尔需要一些机制来垃圾收集很少使用的HTML文件以节省文件空间。
总而言之,我相信我的GET / HEAD优化架构可以干净利落地实施。我想首先就这个想法提出意见(我认为它很好,但我可能错了)以及是否有人已经体验过这样的架构,甚至可能知道实现它的免费框架。
最后,我想指出客户端缓存不是我追求的解决方案,因为多个不同的客户端将GET或HEAD在同一页面。此外,我想在预先计算的文件存在的情况下绝对避免在GET / HEAD请求期间的servlet机制。甚至不应该调用它来在GET / HEAD请求中提供与缓存相关的HTTP头,也不应该将文件转储到输出。
问题是:
我认为HTTP缓存无法实现我的目标。据我所知,HTTP缓存仍然需要使用HEAD请求调用servlet,以了解POST是否同时更改了页面。由于页面更改将在不可预测的时间点发生,因此表示过期时间的HTTP标头不够好。
答案 0 :(得分:1)
使用过期 HTTP标头和/或 HTTP条件请求。
过期
Expires entity-header字段给出了响应被视为过时的日期/时间。缓存(代理缓存或用户代理缓存)通常不会返回过时的缓存条目,除非首先使用源服务器(或具有实体的新副本的中间缓存)进行验证。有关到期模型的进一步讨论,请参阅第13.2节。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
有条件请求
使用Expires,Last-Modified和/或ETag标头装饰可缓存的响应。使用If-Modified-Since,If-None-Match标头,If- *等条件发出请求(请参阅RFC)。
e.g。 最后回复标题:
...
Expires: Wed, 15 Nov 1995 04:58:08 GMT
...
在到期日期之前不对资源执行新请求(Expires标头),然后执行条件请求:
...
If-Modified-Since: Wed, 15 Nov 1995 04:58:08 GMT
...
如果未修改资源,则返回304 Not Modified响应代码,并且响应没有正文。 200 OK,否则返回身体反应。
注意:HTTP RFC还定义了Cache-Control标头
请参阅HTTP中的缓存 http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html