原文地址
https://www.mnot.net/cache_docs/
缓存是什么
缓存监视着发送的请求,并保存着诸如HTML页面、图片或文件等回复的备份。当用户再次访问相同的路径时,可以直接从保存的回复中而非服务器上获取。
缓存有哪些好处
降低延迟————从缓存中获取信息更快,占用更少时间,使得页面更具响应式。
减少网络传输消耗————因为回复可以被重复利用,故而减少了带宽,也减少了为之付出的金钱,让带宽保持在稳定的水平上并且易于管理。
有哪些类型的缓存
浏览器缓存 Browser Caches
在任何现代浏览器的首选项对话框都中您都能看到“缓存”这一选项。缓存是用您电脑的一部分硬盘存储回复信息。浏览器缓存的规则相当简单。通常对于一次会话而言,缓存会确保回复的新鲜。
在用户点击“后退”按钮或者超链接时缓存就会生效。当您在整个网站使用相同的导航图片时,您几乎可以立刻从浏览器缓存中获取它们。
代理缓存 Proxy Caches
代理缓存使用相同的规则,但规模更大。代理服务器用这一方式为成百上千的用户提供服务。大公司和互联网服务提供商们(ISP)经常在防火墙上设置它们,或作为独立设备(也叫中间人)。
因为代理缓存即不是客户端也不是服务器的一部分,它保存在网络中,所以请求必须以某种方式找到它们。一种方法是使用浏览器的代理设置手动告诉它使用哪一个代理。另一种方法则是使用拦截代理。因为拦截代理保存着底层网络本身定位到的请求,所以客户端不需要进行任何配置,甚至不需要知道它们的存在。
代理缓存是一种共享缓存。它们可以同时被很多用户使用而非一个用户,常用的请求节省了大量时间,所以能极大地降低延迟和减少网络传输消耗。
网关缓存 Gateway Caches
也被称为“反向代理缓存”或“替代(surrogate)缓存”。网关缓存也是中间人,但却并非是由网络管理者而是由网站管理者自己部署的,以便提升他们网站的可扩展性、可靠性和表现性。
请求有多种方式来触发网关缓存,但典型是由负载均衡来实现,对请求来说就好像访问服务器一样。
内容分发网络(CDN)会在整个网络中分发网关缓存并将之贩卖给感兴趣的网站。典型案例是Speedera和Akamai。
本教程聚焦在浏览器缓存和网关缓存上,当然也会涵盖上一些代理缓存。
缓存适合我吗?为什么我要用缓存?
缓存是互联网中最容易被误解的技术之一。因为代理缓存会“隐藏”网站的用户,使得网站管理者很难看到是究竟谁在访问他们的网站,所以他们很担心会失去对网站的控制。
但是不幸的是,如果缓存不存在,为了让用户准确地看到他们的网站他们又不得不使用大量的变量。请不用为此担忧,本教程将会指导您如何在使用缓存的前提下也能获取到用户信息。
还有人担忧缓存可能会提供过时的或陈旧的内容。这也不用担心,本教程会向您展示如何配置服务器来控制缓存的内容。
从另一个角度来说,只要您安排得当,缓存可以让您的网站加载更快,并且能节省服务器和网络的负担。这种差异显而易见:一个没有缓存的网站要耗时数秒来加载,而一个用了缓存的网站可以即刻看到内容。用户青睐于能更快加载出来的网站,并且会更频繁地去访问它们。
许多大型互联网公司仅仅为了让用户更快地访问它们的网站,便耗费了数百万美元去建设服务器来复制它们的内容,这也印证了缓存的作用,并且缓存比服务器而言更加贴近用户。最重要的是,您根本不用为缓存付钱。
不管你喜欢与否,代理缓存和浏览器缓存都会存在。即使您不去配置您的网站,它们也会被缓存管理员用默认的方式所使用。
CDN很有趣,因为不同于代理缓存,它们的网关缓存更贴切被缓存网站的利益,所以不会出现以上的问题。不过即使是使用CDN,也要考虑代理缓存和浏览器缓存。
缓存是如何工作的?
所有缓存都有一套自己的规则,来确定它们何时被使用。有些规则在协议里(HTTP 1.0和1.1)就定义好的,而有些则是通过缓存管理员(浏览器或者代理管理员)设置的。
通常来说,有以下几种规则:
- 如果回复头告诉缓存不要保存回复,那么缓存就不会保存。
- 如果请求已通过身份验证或者是安全的(比如HTTPS),那么回复就不会通过共享缓存进行保存。
- 缓存的回复如果满足以下条件,则被认为是新鲜的(也就是说可以直接被客户端使用而不用经过服务器的检验):
有超时时间或其他的时间控制头设置并满足条件。
最近缓存获取过这个回复,并且上一次改动离现在过了很久。
新鲜的回复可以直接从缓存中返回,而无须通知服务器。
- 如果回复是陈旧的,那么服务器会验证它,或者成功则会告诉缓存这个备份否仍然是有效的。
- 在一些特定的情况下————比如说当离线时,缓存可以使用陈旧的回复,而无须通知服务器。
如果回复中没有验证项(ETag或Last-Modified头),也没有明确的新鲜度信息,那么它通常(但不总是)被认为是不能被缓存的。
总之,新鲜度和验证项是检验缓存最重要的方式。新鲜的回复会即刻从缓存中被使用,而验证项能防止重复发送同样的回复。
如何控制缓存
网站开发者和网站管理者可以用一些工具来调整缓存。这可能需要您在配置服务器上亲自花一番功夫,但结果肯定是值得的。之后的章节会详细描述。
HTML Meta标签和HTTP头
网站作者会将描述网站的标签放在文档的<HEAD>部分。这些Meta标签可以将文档标记为不可缓存,或会在一定事件内失效。
Meta标签容易上手,但并不十分有效。因为它只用到了一部分的浏览器缓存,而非代理缓存(因为代理缓存根本不会访问文档)。给一个页面放置一个no-cache Meta标签可能会很诱人,但它不一定能保证新鲜程度。