这是关于php进阶到架构之nginx进阶学习的第五篇文章:深入理解浏览器缓存,我来为大家科普一下关于ios哪个浏览器可以缓存 深入理解浏览器缓存?以下内容希望对你有帮助!
ios哪个浏览器可以缓存 深入理解浏览器缓存
目录概述浏览器缓存的作用缓存读取的原理协商缓存强制缓存协商缓存与强制缓存区别小结php7进阶到架构师相关阅读概述这是关于php进阶到架构之nginx进阶学习的第五篇文章:深入理解浏览器缓存
第一篇:5分钟搞懂nginx的location匹配规则第二篇:nginx rewrite规则详解第三篇:5分钟上手nginx分流实战第四篇:Nginx跨域配置第五篇:深入理解浏览器缓存浏览器缓存的作用缓存可以减少数据传输。节省了网络带宽,从而更快的加载页面。缓存降低了服务器的要求,从而服务器更快的响应。那么我们使用浏览器缓存,浏览器缓存的资源文件到什么地方去了呢?
那么首先来看下浏览器memory cache 和 disk cache缓存
memory cache:
它是将资源文件缓存到客户端(你的电脑或手机)内存中。等下次请求访问的时候不需要重新下载资源,而是直接从内存中读取数据。
disk cache:
它是将资源文件缓存到硬盘(你的电脑或手机磁盘)中。等下次请求的时候它是直接从硬盘中读取。
那么memory cache与disk cache的区别是什么?
memory cache(内存缓存):
退出进程时(如关闭浏览器)数据会被清除
disk cache(硬盘缓存):
退出进程时(如关闭浏览器)数据不会被清除
内存读取比硬盘中读取的速度更快。
但是我们也不能把所有数据放在内存中缓存的,
因为内存也是有限的。
缓存读取的原理先从内存中查找对应的缓存,
如果内存中能找到就读取对应的缓存,
否则的话就从硬盘中查找对应的缓存,
如果有就读取,
否则的话,就重新网络请求。
那么浏览器缓存它又分为2种:协商缓存和强制缓存。
协商缓存客户端向服务器端发出请求,服务端会检测是否有对应的标识,
如果没有对应的标识,服务器端会返回一个对应的标识给客户端,
客户端下次再次请求的时候,把该标识带过去,
然后服务器端会验证该标识,
如果验证通过了,则会响应304,告诉浏览器读取缓存。
如果标识没有通过,则返回请求的资源。
协商缓存的标识又有2种:ETag/if-None-Match 和 Last-Modified/if-Modify-Since
协商缓存Last-Modified/if-Modify-Since
浏览器第一次发出请求一个资源的时候,服务器会返回一个last-Modify到hearer中.
Last-Modify 含义是最后的修改时间。
当浏览器再次请求的时候,request的请求头会加上 if-Modify-Since,该值为缓存之前返回的 Last-Modify.
服务器收到if-Modify-Since后,根据资源的最后修改时间(last-Modify)和该值(if-Modify-Since)进行比较,
如果相等的话,则命中缓存,返回304,
否则, 如果 Last-Modify > if-Modify-Since,
则会给出200响应,并且更新Last-Modify为新的值。
协商缓存ETag/if-None-Match
ETag的原理和上面的last-modified是类似的。
ETag则是对当前请求的资源做一个唯一的标识。
该标识可以是一个字符串,文件的size,hash等。
只要能够合理标识资源的唯一性并能验证是否修改过就可以了。
ETag在服务器响应请求的时候,返回当前资源的唯一标识(它是由服务器生成的)。
但是只要资源有变化,ETag会重新生成的。
浏览器再下一次加载的时候会向服务器发送请求,会将上一次返回的ETag值放到request header 里的 if-None-Match里面去,服务器端只要比较客户端传来的if-None-Match值是否和自己服务器上的ETag是否一致,
如果一致说明资源未修改过,因此返回304,
如果不一致,说明修改过,因此返回200。
并且把新的Etag赋值给if-None-Match来更新该值。
last-modified 和 ETag之间对比
1. 在精度上,ETag要优先于 last-modified。
2. 在性能上,Etag要逊于Last-Modified。Last-Modified需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
3. 在优先级上,服务器校验优先考虑Etag。
强制缓存浏览器在加载资源的时候,会先根据本地缓存资源的header中的信息(Expires 和 Cache-Control)来判断是否需要强制缓存。如果命中的话,则会直接使用缓存中的资源。否则的话,会继续向服务器发送请求。
Expires
Expires 是http1.0的规范,它的值是一个绝对时间的GMT格式的时间字符串。这个时间代表的该资源的失效时间,如果在该时间之前请求的话,则都是从缓存里面读取的。但是使用该规范时,可能会有一个缺点就是当服务器的时间和客户端的时间不一样的情况下,会导致缓存失效。
Cache-Control:
是http1.1的规范,它是利用该字段max-age值进行判断的。该值是一个相对时间,比如**Cache-Control: max-age=3600,**代表该资源的有效期是3600秒。
no-cache:
需要进行协商缓存,发送请求到服务器确认是否使用缓存。
no-store:禁止使用缓存,每一次都要重新请求数据。
public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。
private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。
Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。
协商缓存与强制缓存区别小结协商缓存本质是通过服务器端的304实现,每次访问都需要请求服务器,然后服务器返回304,从而读取浏览器本地(内存或文件)缓存
强制缓存是通过Cache-Control和expire实现,第一次需要请求服务器,然后在服务器失效之前****无需请求服务器,直接读取浏览器本地(内存或文件)缓存。
php7进阶到架构师相关阅读https://www.kancloud.cn/gofor/gofor
最后,欢迎大家留言补充,讨论~~~,