前言
我们常说的缓存,基本可分为两类:
- 客户端缓存
- 服务器缓存
由于服务器缓存跟http协议也没啥关系,它是需要一些服务器技术的支持(比如 redis等),所以这里就不涉及了。其实它大致的原理就是,比如客户端来了个请求,那么服务器就需要从数据库中读取数据,这样频繁的操作数据库, 就会造成效率上的问题,并且磁盘的读取速度是比较慢的;所以为了解决类似的问题,就可以使用服务器缓存,也就是将经常需要使用的数据保存起来,比如保存到内存中,以便后续使用。
今天就探讨探讨客户端缓存;客户端缓存跟http协议就有很大关系了,为什么这么说呢? 因为客户端(比如浏览器)要不要缓存,缓存过期时间是多少等等信息,是需要服务器告诉它的,那服务器又是怎么告诉浏览器的呢,那就只能通过http协议了。
一、什么是客户端缓存
所谓客户端缓存,顾名思义,就是将某一次的响应结果保存在客户端(比如浏览器)中,而后续的请求仅需要从缓存中读取即可;
客户端缓存的作用:
- 降低服务器的压力
- 减少网络带宽消耗
- 减少网络延迟,加快页面打开速度
二、缓存的基本原理
首先我们来看一个简单的客户端缓存流程图:
通过上图可知,当客户端第一次请求时,服务器给予了响应,客户端渲染执行,并将本次响应加入了缓存中,后续再请求时,就直接从缓存中读取。这是一个简单的客户端缓存,但实际情况并非这么简单,为什么呢?这就涉及到缓存策略了,首先我们考虑几个问题:
- 服务器在响应的时候,客户端是怎么知道该次请求是不是需要缓存?
- 哪些资源需要加入到缓存,哪些不需要呢?
- 缓存的时间的多久?
- 如果缓存过期了,可是服务器的资源并没有发生变动,该如何处理?
- 如果服务器的资源被改动,客户端又该如何更新缓存呢?
- …
对于这些问题,就要涉及到http中的缓存协议了。
1. 来自服务器的缓存指令
对于上述第一个问题,服务器在响应的时候,客户端是怎么知道该次请求是不是需要缓存?其实就是服务器在响应时,附带了一些缓存指令,浏览器看到后,会自动识别,具体如下: