HTTP缓存



前言

从Response Headers的三个属性入手:cache-control,


(一)

一、cache-control

1.max-age:最大缓存有效时间(public)http 1.1
比如说向服务端请求一张图片资源,返回给前端,max-age就是这张图片的最长缓存时间
流程:用户请求一个资源,浏览器发送请求到服务器->服务器给这个资源设置一个响应头,cache-control:max-age=60->设置好以后,会把资源和响应头返回给前端->在有效时间内再次访问此资源就会从缓存中取资源
max-age:没过期->200 from memory cache
过期->200
s-maxage:没过期->304 显示大小和请求时间
过期->200
在这里插入图片描述
2.s-maxage:最大缓存有效时间(private)
s-maxage优先级>max-age
流程:浏览器发送请求到服务器->服务器给这个资源设置一个响应头,cache-control:max-age=60 s-maxage=100->设置好以后,会把资源和响应头返回给前端,同时会将max-age设置到当前浏览器中,把s-maxage设置到代理服务器当中->当再次访问该资源时,浏览器会向代理服务器请求此资源->代理服务器判断s-maxage有没有过期,如果没有过期,由我的代理服务器将缓存的信息返回给前端,如果过期了,代理服务器向原服务器去请求此资源,此资源返回给代理服务器,代理服务器将资源返回给前端。
3.no-cache:不管缓存有没有过期,使用此资源前,都会去服务器确认此资源有没有过期(确认资源的有效性)
4.must-revalidate:在我的缓存期间之内,就会直接拉取缓存信息,直到缓存时间过期,才会去服务器确认资源的有效性
5.no-store:不缓存
6.public:公共的
7 .private:私人的

前端 -> 代理服务器(公共的public) -> 服务器
比如说,进入京东,我要搜索一个商品,搜索记录会缓存在服务器中,此时是private缓存。

二、expires

过期时间 http 1.0
如果设置了max-age,则遵循max-age的过期时间;如果没有设置max-age则遵循expires的过期时间

三.last-modified

文件在服务器端最后被修改的时间
作用:解决问题:服务器端对某一资源设置了max-age强制缓存,但是此资源被修改了,但是浏览器再次请求此资源的话,如过没有失效,则服务器直接将缓存资源返回给前端,并没有同步更改的资源。
如果有last-modified被修改的信息,则浏览器会重新向服务器请求最新资源,不管max-age时间有没有失效

四.if-modified-since

Last-Modified 是由服务器发送给客户端的HTTP相应头标签
If-Modified-Since 则是由客户端发送给服务器的HTTP请求头标签
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。
(1)如果服务器端的资源没有变化,则时间一致,自动返回HTTP状态码304状态码,内容为空,客户端接到之后,就直接把本地缓存文件显示到浏览器中,这样就节省了传输数据量。
(2)如果服务器端资源发生改变或者重启服务器时,时间不一致,就返回HTTP状态码200新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
这样比对,会出现问题:
如果,我在一个文件中按了一个空格,但是此空格又没什么用,我又把空格删除了,实际上此文件内容并没有被修改,但是服务端的last-modified的值会被更新,则last-modified与if-modified-since会比对失败,则浏览器重新向服务端请求资源,但请求回来的资源与上一次相同,则多此一举。
则有新的响应头字段etag
etag的优先级高于Last-Modified

四.etag

哈希值
Etag是服务端的一个资源的标识,在 HTTP 响应头中将其传送到客户端。
当你第一次请求某一资源时,服务端会返回在响应头中的etag;当第二次请求此资源时,客户端同时发送If-None-Match,它的值就是etag的值;然后服务器会比对客户端发送过来的If-None-Match是否与服务端的etag相同,如果相同,返回状态为304,客户端继续使用本地缓存,不解析服务器返回的数据(这种场景服务器也不返回数据,因为服务器的数据没有变化嘛);如果不相同,返回状态为200,客户端重新解析服务器返回的数据

五.If-None-Match

哈希值
在这里插入图片描述
客户端在向服务端请求资源的时候,通过If-None-Match请求头带上了之前服务端返回的Etag的值。服务端收到第二次请求的时候,发现携带了If-None-Match字段,就重新计算服务器对应资源的Etag,如果二者匹配了,就认为资源没有发生变化,直接给客户端相应304,让客户端读取缓存中的数据。

(二)分级缓存策略

第一级缓存:max-age,expired(强制缓存)
第二级缓存:304、200 last-modified,etag (协商缓存)
第三级缓存:客户端重新拉取数据
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值