上游缓存

目前为止,本章的焦点一直是对你 自己的 数据进行缓存。 但还有一种与 Web 开发相关的缓存: 上游缓存。 有一些系统甚至在请求到达站点之前就为用户进行页面缓存。

下面是上游缓存的几个例子:

  • 你的 ISP (互联网服务商)可能会对特定的页面进行缓存,因此如果你向 http://example.com/ 请求一个页面,你的 ISP 可能无需直接访问 example.com 就能将页面发送给你。 而 example.com 的维护者们却无从得知这种缓存,ISP 位于 example.com 和你的网页浏览器之间,透明地处理所有的缓存。

  • 你的 Django 网站可能位于某个 代理缓存 之后,例如 Squid 网页代理缓存 (http://www.squid-cache.org/),该缓存为提高性能而对页面进行缓存。,该缓存为提高性能而对页面进行缓存。) 在此情况下 ,每个请求将首先由代理服务器进行处理,然后仅在需要的情况下才被传递至你的应用程序。

  • 你的网页浏览器也对页面进行缓存。 如果某网页送出了相应的头部,你的浏览器将在为对该网页的后续的访问请求使用本地缓存的拷贝,甚至不会再次联系该网页查看是否发生了变化。

上游缓存将会产生非常明显的效率提升,但也存在一定风险。 许多网页的内容依据身份验证以及许多其他变量的情况发生变化,缓存系统仅盲目地根据 URL 保存页面,可能会向这些页面的后续访问者暴露不正确或者敏感的数据。

举个例子,假定你在使用网页电邮系统,显然收件箱页面的内容取决于登录的是哪个用户。 如果 ISP 盲目地缓存了该站点,那么第一个用户通过该 ISP 登录之后,他(或她)的用户收件箱页面将会缓存给后续的访问者。 这一点也不好玩。

幸运的是, HTTP 提供了解决该问题的方案。 已有一些 HTTP 头标用于指引上游缓存根据指定变量来区分缓存内容,并通知缓存机制不对特定页面进行缓存。 我们将在本节后续部分将对这些头标进行阐述。