前端缓存机制有多种,如浏览器缓存、CDN缓存、DNS缓存、代理服务器缓存等。
CDN缓存
CDN全称是Content Delivery Network,即内容分发网络。CDN的原理是将资源存放在各地的缓存服务器上,当用户请求资源时,从就近的服务器上返回缓存的资源,而不需要每次都从源服务器获取,减轻源服务器的压力,又能提升用户的访问速度。
浏览器缓存
浏览器可以将用户请求的资源进行缓存,存放在本地。浏览器缓存一般通过请求头来设置。
与浏览器缓存有关的头部有:
-
Cache-Control:在请求头中使用时,可选值有:
在响应头中使用时,可选值有:
一般比较常用的是max-age、no-cache、no-store - Expires:服务器告诉浏览器缓存的过期时间。在这个时间之前,都会直接从缓存中读取文件。
下面的两对报文信息是用来做缓存校验的(验证缓存是否有效),当服务器的资源更新了,客户端需要及时刷新缓存,或者当客户端的资源过期了,但服务器上的资源尚未更新,此时不需要重新发送数据。 - Last-Modified和If-Modified-Since
首先,服务端返回文件给客户端时,会将该文件的最后修改时间通过Last-Modified传回给客户端。客户端下一次请求时,将这个最后修改时间通过If-Modified-Since字段传给服务器,服务器查看该时间是否与文件的最后修改时间一致,如果一致则返回304,使用浏览器缓存的文件,如果不一致则返回新文件并带上Last-Modified。 - ETag和If-None-Match
由于Last-Modified和If-Modified-Since的最小时间单位是秒,如果文件在一秒内多次改变,服务器无法判断出来,文件可能无法及时更新。为了解决文件修改时间不精确带来的问题,ETag就出来。服务器在返回文件给浏览器时,同时带上文件的唯一标识ETag,当浏览器的缓存文件过期时,浏览器带上请求头If-None-Match(即上一次请求的ETag),服务器对比If-None-Match与当前文件的ETag,如果一直则返回304,不一致则再次返回文件和ETag。
DNS缓存
浏览器会将服务器的域名与IP地址的映射缓存在本地,这样用户在访问网站时,不用每次都去查询DNS映射表。
代理服务器
在浏览器和服务器之间架设的一个服务器 ,这个代理服务器会帮助浏览器去请求页面,然后将页面进行处理和压缩(例如压缩图片和文件),使页面变小,再传输给浏览器。大部分代理服务器都有缓存的功能,如果浏览器所请求的文件在它本机中存在且是最新的,就不需要再从源服务器请求数据,提高了浏览速度。
预加载机制
在浏览某个页面时,浏览器会判断页面的关联内容,进行预加载。用户在浏览A页面时,就加载好B页面,这样当用户去访问B页面时,B页面很快就出来,提升了用户体验。但这个机制有一定的缺陷,就是预判不一定准确,可能会造成流量和资源的浪费。