在您给出的链接中,“短语“使实体无效”意味着缓存将从其存储中删除该实体的所有实例,或者将它们标记为“无效”并且需要强制重新验证才能被为响应后续请求而返回。”。现在的问题是缓存在哪里?相信文章说的Cache就是服务器缓存。
我在 VC++ 中从事过一个项目,每当模型更改时,缓存都会更新。实现这一点需要一个编程逻辑实现。您提到的文章正确地说“HTTP 协议无法保证所有此类缓存条目都被标记为无效”HTTP 协议不能自行使缓存无效。
在我们的项目示例中,我们使用了发布订阅机制。甚至当 A 类的对象被更新/插入时,它也会被发布到总线上。控制器注册以监听总线上的对象。假设控制器对对象 A 的更改感兴趣,则无论何时更改和发布对象类型 B,它都不会被回调。当对象类型 A 确实发生更改并发布时,控制器 A 的侦听器功能会使用对象 A 的最新更改更新缓存。 GET /companies 的后续请求将从缓存中获取最新的。现在在更改对象 A 和使用最新更改刷新缓存之间存在时间间隔。为了避免在这个时间间隙中发生错误,对象在对象 A 更改之前被标记为脏。因此,介于这些时间之间的请求将等待脏标志被清除。
还有一个浏览器缓存。我记得 ETAG 用于验证这一点。ETAG 是资源的校验和。对于这个客户应该以某种方式保持旧的 ETAG 值。如果资源的校验和已更改,则发送带有 HTTP 200 的新资源,否则发送 HTTP 304(使用本地副本)。
[更新]
PUT /公司/任天堂
获取/公司
是两种不同的资源。当执行 PUT /companies/Nintendo 请求时,您的 /companies/Nintendo 的缓存只会被更新,而不是 /companies(我说的是客户端缓存)。假设您GET /companies/Nintendo
下次调用,根据 http 标头返回响应。 GET /companies
是一个全新的请求,因为它指向不同的资源。
现在的问题是 http 标头应该是什么?它纯粹是特定于应用程序的。假设它是我不会缓存的股票报价。假设它是我将缓存一段时间的新闻项目。您的参考链接http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
包含缓存 http 标头的所有详细信息。唯一没有过多提及的是 ETag 的使用。ETag 可以有资源的校验和。检查http://en.wikipedia.org/wiki/HTTP_ETag
并检查https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers