Open minhuaF opened 3 years ago
问题背景 在网路服务器上新建了一个目录,用来给产品同学上传用户的半身像,突然有一天产品跑来说,我在服务器上替换了一个用户的半身像,为什么在页面上看到的还是旧的图片而不是新的? 此时的你可以怎么解释给产品同学听呢?反正这时的只跟产品说是缓存的问题,但是对于缓存的细节还是没有很能解释清楚,比如
基于上面这些问题,就整理了下面这个文章,希望能一篇文章把Web缓存的各个方面都理解了,那我们就带着上面的问题场景,来阅读下面的内容吧。
默读三百遍,背下来! Web缓存是一种保存资源副本并在下一次请求时直接使用该副本的技术; 当Web缓存发现请求资源已经被存储时,它会拦截请求,并返回该资源的副本,而不会去源服务器下载。
默读三百遍,背下来!
既然Web缓存好处那么多,那永久缓存资源是否可行呢?答案当然是不可以的,因为缓存只有有限的空间用户存储资源副本,所以缓存会定期将一些副本删除,这个过程叫做缓存驱逐。
所以才有下面比较复杂的缓存机制,有人也会说,既然那么麻烦,能不能服务器资源更新的时候,自动通知客户端缓存更新呀?答案当然是不可以的,因为HTTP是C/S模式的协议。意思就是说,服务器与客户端的通讯只能由客户端主动发起,而不能由服务器端自动下发的。
简单流程如下
比较具体的流程如下
Expires是HTTP/1制定的,受限于本地时间,所以会有不准确的情况,目前部分网站已经放弃了对这个字段的缓存策略,毕竟如果有Cache-control,Expires就会被忽略,这里对Expires的流程就后补吧(其实是发现同时在一个流程图上面体现有点困难...)
这两个字段由服务器的响应头返回,
Cache-control可以在响应头或请求头中设置,并可以组合使用多种指令:
协商缓存就是强缓存失效后,浏览器携带缓存标识想服务器发起请求,有服务器根据缓存标识决定是否使用缓存的过程。
Age 消息头里包含对象在缓存代理中存储的时长,已秒为单位;
Age
Etag 是资源的特定版本的标识符。给定URL中的资源变更,则一定要生成新的Etag值。(Etag的生成方式,不同类型服务器有不同的生成方法)
Etag
-彻底弄懂浏览器缓存策略 -深入理解浏览器的缓存机制
Expires是HTTP/1制定的,受限于本地时间,所以会有不准确的情况,目前部分网站已经放弃了对这个字段的缓存策略,毕竟如果有Cache-control,Expires就会被忽略,这里对Expires的流程就后补吧(其实是发现同时在一个流程图上面体现有点困难...)
expires 是 HTTP 1.1 版本制定的
问题背景 在网路服务器上新建了一个目录,用来给产品同学上传用户的半身像,突然有一天产品跑来说,我在服务器上替换了一个用户的半身像,为什么在页面上看到的还是旧的图片而不是新的? 此时的你可以怎么解释给产品同学听呢?反正这时的只跟产品说是缓存的问题,但是对于缓存的细节还是没有很能解释清楚,比如
基于上面这些问题,就整理了下面这个文章,希望能一篇文章把Web缓存的各个方面都理解了,那我们就带着上面的问题场景,来阅读下面的内容吧。
什么是Web缓存?
Web缓存有什么好处?
既然Web缓存好处那么多,那永久缓存资源是否可行呢?答案当然是不可以的,因为缓存只有有限的空间用户存储资源副本,所以缓存会定期将一些副本删除,这个过程叫做缓存驱逐。
所以才有下面比较复杂的缓存机制,有人也会说,既然那么麻烦,能不能服务器资源更新的时候,自动通知客户端缓存更新呀?答案当然是不可以的,因为HTTP是C/S模式的协议。意思就是说,服务器与客户端的通讯只能由客户端主动发起,而不能由服务器端自动下发的。
Web缓存过程具体是怎么样的呢?
简单流程如下
比较具体的流程如下
强缓存
expires与last-modified
Expires是HTTP/1制定的,受限于本地时间,所以会有不准确的情况,目前部分网站已经放弃了对这个字段的缓存策略,毕竟如果有Cache-control,Expires就会被忽略,这里对Expires的流程就后补吧(其实是发现同时在一个流程图上面体现有点困难...)
这两个字段由服务器的响应头返回,
Cache-control
Cache-control可以在响应头或请求头中设置,并可以组合使用多种指令:
判断是否是强缓存
协商缓存
协商缓存就是强缓存失效后,浏览器携带缓存标识想服务器发起请求,有服务器根据缓存标识决定是否使用缓存的过程。
响应头的字段解释
Age
消息头里包含对象在缓存代理中存储的时长,已秒为单位;Etag
是资源的特定版本的标识符。给定URL中的资源变更,则一定要生成新的Etag值。(Etag的生成方式,不同类型服务器有不同的生成方法)参考资料
-彻底弄懂浏览器缓存策略 -深入理解浏览器的缓存机制
todolist