详细介绍:【计算机网络】什么是强缓存和协商缓存?它们的工作原理是什么?
【简要回答】
1、解释强制缓存是什么
解释Expires和Cache-Control字段,描述前者的1个缺点和后者的1个优点
2、解释协商缓存是什么
解释Last-Modified和Etag字段,描述前者的2个缺点和后者的2个优点
描述两个字段的达成流程
3、总结:
优先级、实际应用中如何配合使用、注意点
【详细回答】
强制缓存:
浏览器判断缓存没有过期,就直接用缓存,这个主动权在浏览器手里。
强制缓存通过2个字段实现:Expires和Cache-Control
1、Expires的实现流程:过期时间,时间点,绝对时间
2、Cache-Control的实现流程:过期时间,时间段,相对时间
区别:他们俩的区别就是Cache-Control能更好的处理服务器与客户端时间不一致问题,由于Expires 是依赖客户端的系统时间来判断是否过期的,若是客户端时间设置不准确,缓存策略可能失效。
协商缓存:
源于加了一个协商的过程,就叫做协商缓存。在缓存过期以后,浏览器需要咨询服务器,是否可以使用缓存,服务器返回304就是告诉浏览器可以直接使用缓存,否则服务器就会返回资源
协商缓存经过2个字段实现:Last-Modified和Etag
- Last-Modified的实现流程:最后修改时间
浏览器首次请求某个资源的时候,服务器就会返回资源并且在响应头中附加Last-Modified这个响应头
这个资源结果的修改时间就是他指的
浏览器收到这个资源后,会将这个资源保存在本地缓存中
同时浏览器会记住该资源的Last-Modified
之后如果浏览器再次请求同一个资源的话
他会发送一个带有If-Modified-Since这样一个字段的请求头
其中就包含上次响应得到的Last-Modified
服务器收到这个字段之后,会检查两个资源的Last-Modified字段是否相同
相同的话,就证明这个记录没有被服务器修改过就是如果
通过就返回给浏览器304,告诉他能够使用缓存
倘若对比的时间不相同,证明这个资源被修改了
那么服务器就会返回200,和新的资源,并在响应头中更新Last-Modified
如果浏览器接收到304,那么他就会直接采用缓存
如果收到200,那么浏览器就会接收资源并且更新缓存
但是这样的缓存有2个缺点:
秒级,因此他无法感知秒级以下的更新就是Last-Modified的最小单位
这就意味着如果在同一秒里,我对文件进行多次修改,就会被视为没有变化
这样即使资源修改了,依然不会返回新的资源
另一个,基于他是以更改档案的修改时间来判断的,
故而在文件内容本身不修改的情况下,依然有可能更改这个记录的修改时间
比如修改了一个文件名,再改回来,
这样就造成了,该文件的内容明明没有修改,但是缓存依旧是失效的
- Etag的完成流程:服务器根据资料内容生成的唯一标识
浏览器首先请求某个资源,继而服务器返回该资源
并且在响应头中附加Etag这个字段
指的是服务器根据记录内容生成的唯一标识
浏览器收到该资源之后,会把这个资源保存在本地缓存
同时浏览器会记住该资源的Etag值
之后浏览器再次请求同一个资源
就会发送一个带有If-None-Match这个字段的请求头
其中具备了上次请求得到的Etag值
服务器就收到这个请求后,先检查服务器里这个资源的Etag值
是否与If-None-Match这个字段里面的Etag值相同
若是相同的话,就证明这个资源没有被修改,会返回给浏览器304
如果不同的话,就证明这个资源被修改了,就返回200并新的附带资源内容和新的Tag值
浏览器如果收到304,就使用本地缓存
浏览器收到200,就会接收新的资源并且接收缓存
区别:在没有修改档案内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;可能有些文件是在秒级以内修改的,Etag能检查到的粒度是秒级的,客户端在 1 秒内能刷新多次;因此,Etag的优先级高于Last-Modified。
总结一下:
Cache-Control字段优先级高于Expires,Etag字段优先级高于Last-Modified。
通过为了达到最佳的性能和用户体验,比如可以设置一个较短的强缓存有效期,并使用第二个协商缓存作为补充,这样允许确保在强缓存过期之后,仍然能够验证资源的有效性。
要求注意的是,协商缓存这两个字段都要求配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。