20 | 生鲜速递:HTTP的缓存控制
20 | 生鲜速递:HTTP的缓存控制
讲述:Chrono
时长11:11大小12.79M
服务器的缓存控制
客户端的缓存控制
条件请求
小结
课下作业
赞 24
提建议
精选留言(81)
- 前端西瓜哥2019-07-13Cache 和 Cookie 的相同点是:都会保存到浏览器中,并可以设置过期时间。 不同点: 1. Cookie 会随请求报文发送到服务器,而 Cache 不会,但可能会携带 if-Modified-Since(保存资源的最后修改时间)和 If-None-Match(保存资源唯一标识) 字段来验证资源是否过期。 2. Cookie 在浏览器可以通过脚本获取(如果 cookie 没有设置 HttpOnly),Cache 则无法在浏览器中获取(出于安全原因)。 3. Cookie 通过响应报文的 Set-Cookie 字段获得,Cache 则是位于 body 中。 4. 用途不同。Cookie 常用于身份识别,Cache 则是由浏览器管理,用于节省带宽和加快响应速度。 5. Cookie 的 max-age 是从浏览器拿到响应报文时开始计算的,而 Cache 的 max-age 是从响应报文的生成时间(Date 头字段)开始计算。展开
作者回复: 总结的非常好。 第三点感觉有点问题,cache缓存的是完整的报文,不单单是body。
共 4 条评论83 - 小鸟淫太2019-07-121. cookie是方便进行身份识,cache是为了减少网络请求。 2. 强制刷新是因为请求头里的 If-Modified-Since 和 If-None-Match 会被清空所以会返回最新数据
作者回复: 回答正确,之前是我弄错了。
共 2 条评论26 - 一步2019-07-13对于第二个问题:发现强制刷新后请求头中 没有了 If-None-Match ,而且 Cache-Control: no-cache 是这个原因吗?
作者回复: 对,没有条件请求头,那么服务器就无法处理缓存,就只能返回最新的数据。
共 3 条评论22 - DENG永青2019-08-07Etag的工作原理 Etag在服务器上生成后,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改.我们常见的是使用If-None-Match.请求一个文件的流程可能如下: 新的请求 客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http头状态码为为200. 同一个用户第二次这个文件的请求 客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如"2e681a- 6-5d044840"),这时服务器判断发送过来的Etag和自己计算出来的Etag,因此If-None-Match为False,不返回200,返 回304,客户端继续使用本地缓存; 注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.展开
作者回复: 写的非常详细,点赞。
20 - 院长。2019-07-15老师我有几个问题想问一下: 1. F5刷新的时候,请求头加上"Cache-Control: max-age=0",您文章里说,服务器用一个最新生成的报文回应浏览器,那这时候响应返回的应该是"200 OK"吗?为什么我在极客网页版的这个页面刷新后,有个叫"106804"的资源返回的是"304",但是强制刷新是"200 ok",产生的效果好像不同呀。这里是不是应该换一种方式说?感觉强制刷新说的有些简单了。 2. F5刷新发送的请求头是固定的吗?还是会根据浏览器不同而产生变化? 3. 200(from memory cache)和200(from disk cache)是针对内存和硬盘的,他们出现的场景分别是什么呢? 4. HTTP缓存有标准性的流程吗?比如说从我输入URL开始,到后续刷新或者强制刷新等? 5.对于"must-revalidate"我有疑问,本身存储机制不就是如果不过期的话可以继续使用,过期的话去请求服务器吗?那这个属性还有什么意义呢? 6. no-cache,no-store,max-age等属性可以共存吗? 问题有点多,因为网上资料质量参差不齐,解释有些也不全相同,所以在这里咨询下老师,希望老师可以解答一下,或者有推荐的讲述HTTP缓存的文章也可以,谢谢老师展开
作者回复: 1.强制刷新请求最新的资源,没有条件请求,所以不会有304,都是200。 2.每个浏览器可能会有不同,但基本的字段是一样的。 3.缓存的位置不一样,浏览器会分别存放到内存或者硬盘上,所以会显示来源不同。 4.http只规定了缓存的用法,具体如何存放如何使用就是客户端自己灵活实现了,怎么方便怎么来。 5.过期后去验证,如果服务器返回304,那么就可以继续重用缓存,而不用下载整个资源。 6.可以看一下流程图,不是所以的属性都能共存的。当然如果你要是都写上也不是不可以,那浏览器就会“精神错乱”了。
共 3 条评论17 - 啦啦啦2019-07-12老师,nocache,每次使用前都需要去浏览器问一下有没有过期,这不也是一次请求吗?那不和没有缓存一个意思吗
作者回复: 不一样,如果服务器返回304,是一个很小的报文,这样浏览器就可以直接重用缓存里的数据,可以节约传输带宽。 nostore每次都会传输完整的报文,成本高。
11 - Marvin2019-08-04我有一个问题,就拿咱们极客时间的网页来说,会请求一个Id-00001.ts的文件,响应头中指示了cache-control: max-age= 7200, 要一个小时才过期,那么为什么每次刷新都是304, 像这种情况不应该直接200 cacahe from disk才对么?为什么明明没有过期还要去服务器协商呢?
作者回复: 刷新时发的是条件请求,不是普通的请求,所以就必须返回304,告诉浏览器内容没有过期,可以继续用缓存。 普通请求才会直接检查缓存,然后是200 cacahe from disk。
共 2 条评论10 - Khirye2019-11-25Hi, 我对缓存控制策略这张流程图有一些疑惑,must-revalidate是指缓存过期之后,必须要向服务器验证缓存,这一步应该是在图中”缓存最多x秒“这个判断之前的吧? 因为只有缓存超过了max-age的期限,才会进入”must-revalidate的判断“这一步吧? 烦请解惑,谢谢!
作者回复: 这张图是“服务器”的缓存策略,也就是说服务器应该如何设置资源的缓存参数,并不是客户端判断缓存的流程。 只要不是no-store就必然会设置max-age,所以must-revalidate是max-age的一个附加条件。
6 - Leon📷2019-07-21小贴士的nginx计算etag我贴下测试logngx_sprintf(etag->value.data, ""%xT-%xO"", r->headers_out.last_modified_time, r->headers_out.content_length_n)相信大家看到这里更清晰明了
作者回复: great。
6 - 风宇殇2021-03-10这篇文章将缓存讲的比较容易理解。https://mp.weixin.qq.com/s/cUqkG3NETmJbglDXfSf0tg
作者回复: 挺好的文章,欢迎多来这样的分享。
5 - walle2019-11-15cache-control 中的 private 是如何识别的呢?是根据session吗还是什么方式开识别是私有缓存呢
作者回复: 缓存策略取决于服务器,它认为这个缓存只能存放在客户端,不能存放在代理上,就设置private。 与session无关。
4 - WL2019-07-12请问老师弱ETag是服务器更新时自己判断本次的更新有没有语义的变化,如果语义有变化就重新生成一个ETag,如果没有变化不重新生成直接使用原来的,请问是这样的流程吗?
作者回复: 强etag和etag的流程都是一样的,只是计算的方式不同,(即判断是否发生变化的方式不同)。 你的理解正确。
4 - Maske2020-06-161.cache的作用为定义浏览器对静态文件如何进行缓存控制,目的是为了有效利用可复用的资源,尽可能减少客户端的请求,优化用户体验减轻服务器响应压力。常用字段值就那么一些,并有各自的含义。cookie的作用是增加了http请求的状态性,让服务器‘认识’当前访问的用户是谁,字段key,value值都可以自定义,比较灵活。 2.看了下天猫首页的css., js文件,普通的刷新(F5)操作中,不会在请求头中包含cache-control、if-none-match,if-Modified-Since,刷新会命中缓存文件,属于强缓存。强制刷新(ctrl + f5)在请求头中附加了cache-control: no-cache,为协商缓存,相当于设置max-age=0;所以此时不会使用本地缓存,当前页面所有的请求均是如此展开
作者回复: good
3 - Larry2020-05-30如果响应报文什么字段都不设置,单纯的返回数据,是不是也不会缓存?
作者回复: 按协议来说,没有规定,就取决于客户端,想缓存也可以。
3 - 游鱼2020-03-20老师,开发提测后,有时需要清缓存才是最新的,强刷都不管用,这个有解决办法吗
作者回复: 看缓存是在哪里了,因为http的传输链路很长,可能在某个节点的缓存时间长,强制刷新不生效,需要具体分析,不好直接给解决方案。
共 2 条评论3 - 来自地狱的勇士2019-07-12老师,既然Etag的算法比较复杂,需要占用服务器资源,那么,实际上服务器会使用Etag吗?看到有的资料说服务器很少会用到Etag,这个说法正确吗?
作者回复: Nginx和Apache都有etag,但算法不同,但都不会用特别消耗计算资源的算法。 其他的web服务器就不太清楚了。
3 - 路漫漫2021-11-16老师,根据服务器的缓存控制那个图,如果cache-control 设置了 no-cache 或 must-revalidate 那就 必须设置 max-age喽?
作者回复: 按照协议要求是这样的,不然不知道应该缓存多长时间。 如果不提供max-age,浏览器也可以估算一个时间,但使用max-age还是最规范的写法。
2 - Joe2020-09-18老师你好,如果使用的是强缓存,比如Cache-Control: max-age=36000,那么在有效期内服务器上的文件发生了改变,客户端怎么才能及时获取最新的文件?更改文件指纹是可以获取最新的文件吗?如果可以这个请求流程是什么样的?
作者回复: 使用if系列的条件请求,用时间戳或者etag,发给服务器,服务器来判断,如果没变化就可以直接重用客户端的缓存,否则就发回新的文件。 可以再仔细看看条件请求,关键就是客户端带上一个小的验证信息,让服务器检查。
共 3 条评论2 - 青莲居士2020-02-11请问下 cache-control 头字段 与 if 系列的请求头字段有依赖关系么 ?
作者回复: if系列是条件请求,收到的通常是304这样的报文。 而max-age等描述的是缓存控制,只要是响应就可以设置,不一定是要有条件请求。 所以说两者没有必然联系,不过两者经常会同时出现,区分它们的应用场景还是很有必要的。
共 2 条评论2 - SeaYang2020-01-15观察了一些网站的资源加载情况,有一些总结,老师帮忙看看呢,辛苦了 一、打开一个网页,比如百度、慕课网之类的,并打开开发者工具,切换到network面板 1、勾选disable cache,刷新,页面及内嵌资源文件的请求头有Cache-Control: no-cache,并且不会发送If-Modified-Since、If-None-Match(响应头设置了Last-Modified、ETag等字段)等请求头,所以文档和内嵌资源文件都会返回完整最新的,这个相当于是强制刷新了吧 2、取消勾选disable cache,刷新,页面的请求头有Cache-Control: max-age=0,而内嵌资源文件的请求头不会有Cache-Control: max-age=0。至于文档和内嵌资源文件从哪里取分两种情况: 1)若第一次请求的响应头设置了Cache-Control: no-cache或must-revalidate,且设置了Last-Modified、ETag等字段,则走条件请求,可能返回200,也可能返回304,分别取最新的数据和取本地缓存;若没设置Last-Modified、ETag等字段,则取最新完整数据 2)若第一次请求的响应头没有设置Cache-Control: no-cache或must-revalidate,文档会获取最新的数据或者304走本地缓存(响应头设置了Last-Modified、ETag等字段);而内嵌资源稍微有点奇怪,有的资源第一次刷新时返回304,后面刷新就返回200走本地缓存了,而有的资源是一直返回200走本地缓存,不知道为什么? 举个例子,在一个新的标签页,打开开发者工具,勾选disable cache,地址栏输入:https://www.imooc.com/course/list,回车待页面完全load,找到图片:https://static.mukewang.com/static/img/course/course-recommend2.png,取消勾选disable cache,刷新,发现这张图片返回304,后面继续刷新就返回200取本地缓存了,而对于别的一些图片则一直返回200取的本地缓存 二、对于文档来说,响应头里面Cache-Control只设置max-age似乎没啥用,刷新的话还是取的最新数据,前进后退只走本地缓存,即使max-age过期了且指定了must-revalidate或no-cache,比如在/20-1和/20-2之间一直前进后退,过了30秒还是取的本地缓存。唯一不确定的是对于文档内嵌资源文件,Cache-Control只设置max-age有没有用,因为一些网站的内嵌资源文件响应头的max-age通常设置的比较大,刷新页面这些内嵌资源文件一般都走的本地缓存,就不知道max-age过期了之后再刷新页面,这些内嵌资源文件还会不会走本地缓存 三、请求头中同时有If-None-Match、If-Modified-Since、Cache-Control,对于服务器来说,If-None-Match、If-Modified-Since的优先级高,也就是即使请求头有Cache-Control: no-cache,走的也是条件请求,而不是直接返回最新完整数据展开
作者回复: 态度非常认真,大力表扬。 关于缓存这块,虽然http协议规定的很清楚,但在实现方面,浏览器、服务器又会有各自的一套策略,去尽量做进一步的优化,而且有的可能还不按规矩来,所以会显得比较混乱。 我们在具体使用缓存的时候就要小心一些,一方面按照标准,另一方面要对不同的浏览器、服务器做测试,保证按照预想的方式处理。
2