缓存(Cache)是计算机领域里的一个重要概念,是优化系统性能的利器。
由于链路漫长,网络时延不可控,浏览器使用 HTTP 获取资源的成本较高。所以,非常有必要把“来之不易”的数据缓存起来,下次再请求的时候尽可能地复用。这样,就可以避免多次请求 - 应答的通信成本,节约网络带宽,也可以加快响应速度。
所谓的避免发送缓存指的是发送请求获得的数据是重复性的,得到的数据都是一致的。浏览器就会把这个请求缓存到本地,下次可以直接读取本地数据,不用重复发送HTTP请求,这样就会避免发送请求
具体流程:
- 发送请求时浏览器查看是否有本地缓存,如果没有向服务器发送请求获得资源
- 服务器响应资源,
标识资源有效期
- 浏览器缓存资源,以Url为key 响应的value为值保存在本地磁盘。等
待下一次请求
那么你可能会问如何标识资源有效期?
在了解这个问题之前我们先了解下 “Cache-Control”
这个字段标识服务器标识资源有效期
如图:
max-age=43200 表示客户端只能缓存43200秒,过期就要重新发送请求
这里的 max-age 是“生存时间”(Time-To-Live),时间的计算起点是响应报文的创建时刻(即 Date 字段,也就是离开服务器的时刻),而不是客户端收到报文的时刻,也就是说包含了在链路传输过程中所有节点所停留的时间,所以这个时间和中间链路传输有很大关系
以上图为例max-age=4300 这个时候如果网络很糟糕传输过程中过去了5秒 ,浏览器收到后只有4295。就要减去在传输过程中占用的时间
Cache-Control 其他value 解释如图:
- no-store:不允许缓存,用于某些变化非常频繁的数据.
- no-cache:它的字面含义容易与 no-store 搞混,实际的意思并不是不允许缓存,而是可以缓存,但在使用之前必须要去服务器验证是否过期,是否有最新的版本。
- must-revalidate:又是一个和 no-cache 相似的词,它的意思是如果缓存不过期就可以继续使用,但过期了如果还想用就必须去服务器验证
缓存失效不是最新的如何去服务器验证
这个时候浏览器可以发送一个请求去验证服务器的缓存,但是这样很容易浪费资源没必要验证缓存重新发送请求.,那么浏览器是如何做的呢?先了解两个HTTP字段
ETag 是“实体标签”(Entity Tag)的缩写,是资源的一个唯一标识,主要是用来解决修改时间无法准确区分文件变化的问题。
If-None-Match 检查验证资源是否过期,把两个请求才能完成的工作合并在一个请求里做
具体流程
- 浏览器发送请求 等待服务器响应
- 服务器响应头返回一个带有 Etag的标识
- 浏览器下次发送请求使用If-None-Match 带上Etag的值
- 服务器收到后验证Etag如果没有发生变化就会返回304状态码告诉浏览器还是可以使用缓存的
以上就是HTTP的缓存机制,由此可见缓存还是很强大的,不管是mysql缓存 cpu缓存 还是单独的缓存redis 都为现在的大数据请求节约了不少资源。