下面的问题是关于为下面描述的 REST 启发的行为实现或已经存在的缓存框架。
目标是 GET 和 HEAD 请求应该像处理静态页面的请求一样有效。
在技术方面,我认为Java Servlets 和MySQL 来实现站点。 (但好的理由的出现可能仍然会影响我对技术的选择。)
网页应支持 GET、HEAD 和 POST; GET 和 HEAD 比 POST 更频繁。页面内容不会随着 GET/HEAD 改变,只有 POST 改变。因此,我想直接从文件系统提供 GET 和 HEAD 请求,并且只提供来自 servlet 的 POST 请求。
在稍后的改进中,为了节省带宽,缓存的 HTML 文件也应该以 gzip 版本提供,当客户端理解时提供。我相信基 native 制应该与未压缩的 HTML 文件相同。
由于会有很多类似 REST 的页面,因此这两种方法可能偶尔都需要一些机制来垃圾收集很少使用的 HTML 文件以节省文件空间。
总而言之,我相信我的 GET/HEAD 优化架构可以干净利落地实现。我想首先对这个想法发表意见(我相信它很好,但我可能错了)以及是否有人已经使用过这种架构,甚至可能知道实现它的免费框架。
最后,我想指出客户端缓存不是我所追求的解决方案,因为多个不同的客户端会 GET 或 HEAD 同一个页面。此外,如果存在预先计算的文件,我想在 GET/HEAD 请求期间绝对避免使用 servlet 机制。甚至不应调用它来在 GET/HEAD 请求中提供与缓存相关的 HTTP header ,也不应将文件转储到输出。
问题是:
我认为 HTTP 缓存没有达到我的目标。据我了解,HTTP 缓存仍需要使用 HEAD 请求调用 servlet,以了解 POST 是否同时更改了页面。由于页面更改将在不可预知的时间点发生,因此说明过期时间的 HTTP header 还不够好。
最佳答案
使用过期 HTTP header 和/或 HTTP 条件请求 .
过期
The Expires entity-header field gives the date/time after which the response is considered stale. A stale cache entry may not normally be returned by a cache (either a proxy cache or a user agent cache) unless it is first validated with the origin server (or with an intermediate cache that has a fresh copy of the entity). See section 13.2 for further discussion of the expiration model.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
有条件的请求
使用 Expires、Last-Modified 和/或 ETag header 装饰可缓存的响应。使用 If-Modified-Since、If-None-Match header 、If-* 等使请求有条件(参见 RFC)。
例如
最后响应 header :
...
Expires: Wed, 15 Nov 1995 04:58:08 GMT
...
不要在过期日期(Expires header )之前对资源执行新请求,然后执行条件请求:
...
If-Modified-Since: Wed, 15 Nov 1995 04:58:08 GMT
...
如果资源未修改,则返回 304 Not Modified 响应代码并且响应没有正文。 200 OK,否则返回带有正文的响应。
注意:HTTP RFC 还定义了 Cache-Control header
请参阅 HTTP 中的缓存
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
关于caching - 高性能被动访问优化的动态 REST 网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923433/