http的自我总结(2)--http缓存

简单介绍

http缓存作为一种提高页面性能的做法是必不可少的,它不仅大大减少带宽而且也会提高页面加载速度,提高用户体验。缓存一般针对的是js,css,图片等静态资源。http缓存分为强缓存和协商缓存,其中强缓存的优先级高于协商缓存。

强缓存

强缓存一般是不用去服务端验证缓存是否过期的,根据上一次去服务端获取的Expires或Cache-Control字段判断缓存是否过期,若过期就去服务端获取数据并且刷新缓存字段,没过期的话就直接在客户端缓存数据里获取数据。

Expires

此字段为http1.0推出的,代表着是缓存过期的时间,如果客户端的时间大于此时间就代表缓存过期,要去服务端获取数据并且刷新此字段的时间。不过由于客户端时间和服务器的时间是有差异的,所以缓存命中也有误差。所以推出了Cache-Control字段来替代,不过因为有时为了兼容1.0,所以有时还会使用Expires字段。

Cache-Control

此字段是http1.1推出的,它有几个值:private,public,max-age,no-cache,no-store。它的优先级高于Expires。

private:此字段是服务端响应报文才有的,代表是该缓存只能由客户端缓存,即代理服务器都不可以缓存。

public:此字段是服务端响应报文才有的,代表是该缓存能由客户端和代理服务缓存。

max-age:此字段是设置缓存XXX秒后过期的字段。在浏览器接收到资源后开始倒计时,这个主要是为了解决Expires绝对时间的误差。

no-cache:此字段代表使用协商缓存来验证是否过期。

no-store:此字段强制不缓存。

协商缓存

协商缓存第一次去请求时,服务端会将数据和缓存标识都给客户端,然后后面每次请求都要去服务端对比一下缓存标识,当服务器数据更改时会更新标识,服务器拿到浏览器发来的标识进行对比,相同代表数据未更改,响应浏览器通知数据未更改,浏览器会去缓存中获取数据,如果标识不同,代表服务器更改过数据,所以会将新的数据和新的标识返回浏览器,浏览器会将在服务器获取到新的数据和标识存入缓存中。协商缓存和强制缓存不同的是,协商缓存每次请求都需要跟服务器通信,而且命中缓存服务器返回状态码不再是 200,而是 304。

Last-Modified和If-Modified-Since

此两个字段是http1.0推出的,使用协商缓存的情况下,第一次请求的时候服务端会给出Last-Modified字段,代表是资源最后修改的时间,在第二次请求后请求报文也会带上一个字段If-Modified-Since,它的值就是上次服务端给的Last-Modified字段的值,然后服务端会将此字段跟请求的资源最后修改的时间做一下对比,如果相等的话,缓存命中,返回304状态码,客户端就会去缓存数据里获取数据,不相等的话,就返回200,在服务端获取新数据和资源修改时间存在If-Modified-Since字段里。

不过这里也有个问题,就是请求的资源新增一个字符又删除了,文件相当于没改,但是资源的修改时间还是会跟着更新,这里就造成缓存命中错误。所以在http1.1中推出了EtagIf-None-Match

Etag和If-None-Match

此两个字段是http1.1推出的。第一次请求的时候服务端会给出Etag 字段来设置缓存的标识(Etag生成计算规则是由服务端来决定的),在第二次请求后请求报文就带上If-None-Match的字段,它的值就是上次服务端给的Etag字段的值,服务器就会用次标识和之前的标识作比较,如果一样就命中缓存,返回304状态码,让客户端去缓存数据里获取数据。当然同样它们优先级高于Last-Modified和If-Modified-Since。

这里需要知道的是,由于Etag是由服务端计算得出,所以实际开发中要以保证服务器性能的前提下生成唯一标识。

总结

为了使缓存策略更加健壮、灵活,HTTP 1.0 版本 和 HTTP 1.1 版本的缓存策略会同时使用,甚至强制缓存和协商缓存也会同时使用,对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接使用缓存,超出有效时间,执行协商缓存策略,对于协商缓存,将缓存信息中的 EtagLast-Modified 通过请求头 If-None-MatchIf-Modified-Since 发送给服务器,由服务器校验同时设置新的强制缓存,校验通过并返回 304 状态码时,浏览器直接使用缓存,如果协商缓存也未命中,则服务器重新设置协商缓存的标识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值