一、是什么
- 缓存是保存在代理服务器或本地的资源副本,为了减少重复请求相同资源的操作、减轻服务器压力、更快地加载页面。
二、作用
- 减少重复请求相同资源,能节省通信流量。
- 能缓解网络瓶颈问题,能更快加载页面。
- 服务器可以更快响应,避免加载的情况。
- 缓解了距离问题,每台网络路由器都会增加流量的时延。把缓存放在附近机房,文件传输距离就短了。
三、 分类
1、(私有)浏览器缓存:Cache-Control: private
- 单个用户使用。
- 大多数浏览器都会把常用的文档缓存到硬盘和内存中。
- 有了本地缓存就能离线浏览文档了,比如浏览器中能向前/后已缓存的页面、保存页面、查看源码。
2、(公有)代理缓存: Cache-Control: public
- 多用户使用。
- 可以被中间代理、CDN 等中间人缓存。代表用户与服务器联系,把重复资源缓存到本地共享返回给有需要的用户。这样资源能够重复使用,减少网络拥堵和延迟。
四、执行流程
1、接收:获取请求报文
2、解析:对报文解析,提取出 URL 和各种首部
3、查询:查看是否已经有本地副本了,否则获取一份并保存在本地。
4、新鲜度检测:查看已缓存的副本是否足够新鲜,否则询问服务器是否有更新。
5、创建响应报文:用新的首部和已缓存的主体创建一个响应报文。
6、发送:把响应报文发送给客户端。
7、日志:可以创建一个日记文件描述这个事务。
五、缓存控制
-
Cache-control
值 说明 no-store 禁止缓存 no-cache 缓存前确认其有效性 max-age = [秒] 响应文档过期时间, 单位为秒。值为 0 时代表响应文档不缓存 private | public (私有)浏览器缓存 | (公有)代理缓存 must-revalidate 可缓存但得向服务器进行新鲜度检查 # 缓存有效期为 3600 秒 Cache-Control: max-age=3600 # 禁用缓存 Cache-Control: max-age=0 Cache-Control: no-store
-
Expires
Expires
表示过期时间,但由于一些服务器时钟不同步会导致偏差,所以最好是使用max-age
。如果有Cache-Control
值,那么Expires
值会被忽略,就是说Cache-Control
优先级高于Expires
。Expires: Thu, 10 Sep 2020 23:27:59 GMT
六、参考资料
- 《HTTP权威指南》
- 《图解HTTP》
- RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching