什么是Web缓存?原理如何?
- 浏览器缓存,又称 HTTP 缓存,指的是:当我们浏览网站的时候,浏览器会在本地存储一个副本,以便下次访问同个网址的时候可以不再连接服务器,直接使用本地的缓存。服务器端程序可以通过 HTTP Cache Headers 来控制缓存行为,减轻服务器的负担,缩短了响应时间,显著得提高网站的性能。
- 缓存更新机制:https://zhuanlan.zhihu.com/p/23299600
- 无缓存,一开始是没有缓存这个概念,每次浏览器向服务器请求同一个资源,都会每次发一遍,非常浪费宽带。
- 有缓存,但无更新。之后浏览器可以资源保存到本地,每次请求服务器的时候,都直接从本地获取,但是如果资源改变,浏览器就无法获取到最新的数据。
- 有缓存+更新。设置Expries: Mon,10 Dec 1990 02:25:22GMT,这是一个资源过期时间,如果超过时间,服务器就重新发送新的的资源,没有超过就从本地获取资源。但控制的功能单一,而且每次资源过期都要过去设置,而且时间格式容易写错。
- 缓存+更新机制升级版 Cache-Control: max-age=300,300秒以内发送的请求直接使用缓存。缺点是如果资源很大并且没有改变,过了300秒还是要直接从服务器获取资源。
- Cache-Control: max-age=300;ETag:W/“e-cbxLFQW5zapn79tQwb/g6Q”,Etag会生成文件MD5的类似的码,当超过300秒后,再次想服务器发请求时,会把文件的MD5码一起发送,服务器通过比对MD5码,发现一致,就返回304状态吗,不返回资源,叫浏览器从本地获取资源
- HTTP缓存首部字段的优先级从高到低分别是 Pragma -> Cache-Control -> Expires 。
头部 | 优势和特点 | 劣势和问题 |
---|---|---|
Expires | 1、HTTP 1.0 产物,可以在HTTP 1.0和1.1中使用,简单易用。2、以时刻标识失效时间。 | 1、时间是由服务器发送的(UTC),如果服务器时间和客户端时间存在不一致,可能会出现问题。2、存在版本问题,到期之前的修改客户端是不可知的。 |
Cache-Control | 1、HTTP 1.1 产物,以时间间隔标识失效时间,解决了Expires服务器和客户端相对时间的问题。2、比Expires多了很多选项设置。 | 1、HTTP 1.1 才有的内容,不适用于HTTP 1.0 。2、存在版本问题,到期之前的修改客户端是不可知的。 |
Last-Modified | 1、不存在版本问题,每次请求都会去服务器进行校验。服务器对比最后修改时间如果相同则返回304,不同返回200以及资源内容。 | 1、只要资源修改,无论内容是否发生实质性的变化,都会将该资源返回客户端。例如周期性重写,这种情况下该资源包含的数据实际上一样的。2、以时刻作为标识,无法识别一秒内进行多次修改的情况。3、某些服务器不能精确的得到文件的最后修改时间。 |
ETag | 1、可以更加精确的判断资源是否被修改,可以识别一秒内多次修改的情况。2、不存在版本问题,每次请求都回去服务器进行校验。 | 1、计算ETag值需要性能损耗。2、分布式服务器存储的情况下,计算ETag的算法如果不一样,会导致浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时发现ETag不匹配的情况。 |