
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存功能的应用是目前大多数软件开发程序员都需要熟练掌握的一个编程技术,而本文我们就简单来了解一下,强缓存与协商缓存的区别都有哪些。
一、强缓存
强缓存看的是响应头的Expires和Cache-Control字段
Expires是老规范,它表示的是一个绝对有效时间,在该时间之前则命中缓存,如果超过则缓存失效,并且,由于它是跟本地时间(可以随意修改)做比较,会导致缓存混乱
Cache-Control是新规范,优先级要高于Expires,也是目前主要使用的缓存策略,字段是max-age,表示的是一个相对时间,例如Cache-Control:max-age=3600,代表着资源的有效期是3600秒。
其他配置
no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。
no-store:禁止使用缓存,每一次都要重新请求数据。
public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
二、协商缓存
当强缓存没有命中的时候,浏览器会发送一个请求到服务器,服务器根据header中的部分信息来判断是否命中缓存。如果命中,则返回304,告诉浏览器资源未更新,可使用本地的缓存。
协商缓存看的是header中的Last-Modified/If-Modified-Since和Etag/If-None-Match
缓存生效,返回304,缓存失效,返回200和请求结果
Etag优先级Last-Modified高
Last-Modified/If-Modified-Since
浏览器一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的后修改时间。
当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的后修改时间判断是否命中缓存,命中返回304使用本缓存,否则返回200和请求新资源。
Etag/If-None-Match
etag是更为严谨的校验,一般情况下使用时间检验已经足够,但我们想象一个场景,如果我们在短暂时间内修改了服务端资源,然后又迅速的改回去,理论上这种情况本地缓存还是可以继续使用的,这就是etag诞生的场景。
使用etag时服务端会对资源进行一次类似hash的操作获得一个标识(内容不变标识不变),并返回给客户端。
再次请求时客户端会在If-None-Match带上etag的值给服务端进行对比验证,如果命中返回304使用缓存,否则重新请求资源。
注:由于e-atg服务端计算会有额外开销,所以性能较差
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。