HTTP主动缓存和协商缓存模型
作者:互联网
假设现在没有代理商店 ----强制缓存和协商缓存 小区楼下的代理商店的缓存方式有两种,一个重视强制缓存,一种是协商缓存 -----------强制缓存 我去超市买书 1.我要买一本书 2.超市说,好的,这是您要的,给您,这本书的完稿时间是2022-01-01,今天凌晨12点过期 3.我收到了,我把报纸备份缓存下来(上面依然有这本书的完稿时间是2022-01-01以及今天凌晨12点过期的信息), 然后看报,然后看完了就把书扔掉了 4。过了一段时间,我又想看这本书了,所以我又需要去超市买书。 这个时候我想,我之前备份了这份书,然后就对比了现在想买书的时间 和之前备份书的有效期。如果还在有效期内,就还看备份的那份书, 如果过了有效期,就去超市 5.结果我发现书还在有效期,所以就去储物房里拿备份的书看(from disk cache) 这个去拿储物房里拿备份书看的决定是我自己做的 ------浏览器决定是否使用缓存------ ----------协商缓存 按ID来确定---- 我去超市买书 1.我要买一份书 2.超市说,好的,这是书,资源ID=eTag,给您,今天有效,今天凌晨12点过期 3.我收到书后,就把书备份了一下,资源ID=etag,放到储物房里,报纸上面有过期时间 4.然后我开始看书,看完以后就把书扔了 5.过了一段时间,我又想看书了,所以我又需要去超市买书。 我先检查了储物房里的书,发现过期了。 所以我打电话给超市,“超市你好,我要买这本书,这本书之前的资源ID是etag,是if-none-match字段的值” 6.超市收到电话,然后先去给你拿书,拿完书就会生成一个资源ID etag,超市对比了一下,发现新的etag和 旧的你反馈的etag是一样的,说明这本书没有做修改,就和你说,小明你好,这本书的状态是304 not nodified, 我就不重复给你同样的书了,你还是看你之前那本书 7.那你知道了,虽然你的储物房里的书过期了,但是内容还是一样的,所以就还是从储物房里拿出这本书来看 8.如果6超市发现生成的新的etag和你反馈的etag不一样,那就说明这本书做了修改,有新的修订本了。 它还是卖新的修订本给你,就把新的书和新的资源ID etag发给你 9.你收到8的新的书了,就把原来储物房里的书更新成新的这本书了 ---------协商缓存 按时间来确定----------- 我去超市买书 1.我要买一本书 2.超市说,好的,这是您要的,给您,今天有效,今天凌晨12点过期,这本书的完稿时间是2022-01-01 00:00:00GMT 3.我收到了,我把报纸备份缓存下来(上面依然有今天有效,今天凌晨12点过期 以及完稿时间是2022-01-01 00:00:00GMT的信息), 然后看报,然后看完了就把书扔掉了 4。过了一段时间,我又想看书的报纸了,所以我又需要去超市买书。 这个时候我想,我之前备份了一份书,然后就对比了现在想买书的时间 和之前备份书的有效期。如果还在有效期内,就还看备份的那份书, 如果过了有效期,就去超市 5.我发现过了有效期,就去超市 “超市,我要买书,上次买的这本书过期了,书的完稿时间(if-modified-since)是2022-01-01 00:00:00GMT” 6.超市说,好的,我确认一下,然后把这本书上次的完稿时间“if-modified-since” 和现在超市里的书的新的完稿时间2022-02-0100:00:00GMT(last-modified)对比。 发现,确实2月份又改过一次,该把修改过的书给小明,所以把新书给小明 (----返回最新资源,HTTP 200 OK) 如果超市里的书的完稿时间和小明提供的完稿时间一样或者还要老,那就说明书最近没有修改 所以超市会和小明说,您之前的书就已经是最新版本了,您看您之前的书吧 小明就继续看自己储物房里放的书 (----返回304 Not Modified,走缓存)
etag和 last modified一种按时间,一种按ID,一般ID的优先级比时间的优先级高
顺序:先看强制缓存(有没有过期) 再看资源ID(资源有没有变 etag) 最后看资源修改时间(last modified)
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control这个网页有cache-control字段的说明文档,讲得很清楚
标签:本书,01,HTTP,协商,备份,超市,缓存,etag 来源: https://www.cnblogs.com/bojiandkake/p/16202697.html