性能优化浅谈http中的Cache-Control:萤石云存储服务器地址

時間:2023-12-30 18:51:33 作者:萤石云存储服务器地址 熱度:萤石云存储服务器地址
萤石云存储服务器地址描述::

Cache-Control 是最重要的条例。这个字段用于指定所有缓存机制在整个请愿响应链中必要遵从的指令。这些指令指定用于阻挠缓存对请愿或响应造成不利搀和的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的,即请愿中存在一个指令并不意味着响应中将存在同一个指令。

HTTP11引入了Cathe-Control,它采用max-age指定组件被缓存多久,从请愿开端在max-age时间内阅读器采用缓存,之外的采用请愿,这样就可以打消Expires的限制,

假如对阅读器兼容性要求很高的话,可以两个都采用。

这里对 304 状态交融max-age做一个结算:

阅读器初次拜访服务器---------------服务器返回200状态

如下图:

阅读器再次请愿服务器时,阅读器会先判断max-age,假如到期则直接请愿服务器,否则直接从缓存中取,

服务器收到请愿后,判断文件是否被改动过,若是则直接返回200,否则返回304,阅读器将从缓存中获取文件。

若同步刷新页面,则阅读器并不会先判断max-age,而是直接发送请愿,服务器收取到请愿后,判断文件是否有变化,若有则返回200,若没有则返回304

我们用拜访时,会先发送一个请愿,之后服务器返回一个应答,在Chrome的开发者工具(按F12或右击抉择查验)中显现了整个过程:

第一部门General是概要,涵盖请愿地址,请愿方式,状态码,服务器地址以及Referrer 手段。

第二部门是应答头部,是服务器返回的。

第三部门是请愿头部,是客户端发送的。

这次我们从两个角度来看看的缓存:缓存管理和缓存校验。

缓存管理:管理缓存的开关,用于标识请愿或拜访中是否开启了缓存,采用了哪种缓存方式。

缓存校验:如何校验缓存,比如怎么定义缓存的有效期,怎么确保缓存是最新的。

缓存管理

在中,管理缓存开关的字段有两个:Pragma 和 Cache-Control。

Pragma

Pragma有两个字段Pragma和Expires。Pragma的值为no-cache时,表示禁用缓存,Expires的值是一个GMT时间,表示该缓存的有效时间。

Pragma是旧产物,已经逐步遗弃,有些网站为了向下兼容还保存了这两个字段。假如一个报文中同时显露Pragma和Cache-Control时,以Pragma为准。同时显露Cache-Control和Expires时,以Cache-Control为准。即优先级从高到低是 Pragma - Cache-Control - Expires

Cache-Control

符合缓存手段时,服务器不会发送新的资源,但不是说客户端和服务器就没有会话了,客户端还是会发请愿到服务器的。

Cache-Control除了在响应中采用,在请愿中也可以采用。我们用开发者工具来模仿下请愿时带上Cache-Control:勾选Disable cache,刷新页面,可以看到Request Headers中有个字段Cache-Control no-cache。

同时在Response Headers中也能到Cache-Control字段,它的值是must-revalate,这是服务端设置的。

Cache-Control字段

在请愿中采用Cache-Control 时,它可选的值有:

在响应中采用Cache-Control 时,它可选的值有:

no-store优先级最高

在Cache-Control 中,这些值可以自由组合,多个值假如冲突时,也是有优先级的,而no-store优先级最高。我们可以测试下:在nginx中做如下配置:

server{
listen88;
rootoptms;
indexindexphpindexindexhtmindexnginx-debian;
location~*^+\(css|js|txt|xml|sf|av)${
add_headerCache-Controlno-store;
add_headerCache-Controlmax-age=3600;
add_headerCache-Controlpublic;
add_headerCache-Controlonly-if-cached;
add_headerCache-Controlno-cache;
add_headerCache-Controlmust-revalate;
}
}

在optms下增加个文件typecss,内容如下:

a{
color000000;
}
afocus,ahover{
text-decorationnone;
color708090;
}

配置好之后,reload下nginx,在阅读器拜访地址12700188typecss,可以看到响应头部涵盖nginx配置中的字段:

重复刷新拜访,会发明每次的状态码都是200,原因是no-store的优先级最高,本地不保留,每次都需要服务器发送资源。

public和private的抉择

假如你用了CDN,你需要关注下这个值。CDN厂商一般会要求cache-control的值为public,提升缓存命中率。假如你的缓存命中率很低,而拜访量很大的话,可以看下是不是设置了private,no-cache这类的值。假如定义了max-age,可以不用再定义public,它们的意义是一样的。

哪里设置Cache-Control

以LNMP的环境为例,一次响应经验的过程是:php-cgi分析代码并执行,将结局返回给nginx,假如nginx前面有反向代理,则会途经一次反向代理服务器,所以cache-control可能会在nginx,php-cgi,php代码,反向代理服务器这些场所场所设置。在phpini中,有个参数是sessioncache_limiter,需要留心下。在nginx中有个很常见的配置:

location~*^+\(ico|gif|jpg|jpeg|png)${
expires30d;
}

这个指令等同于cache-control max-age=2592000,同时你会在响应头部看到一个etag字段,这是因为nginx默认开启,假如要关闭可以增加个配置etag off。这个etag就是我们接下要看的缓存校验字段。

缓存校验

在缓存中,我们需要一个机制来验证缓存是否有效。比如服务器的资源更新了,客户端需要及时刷新缓存;又或者客户端的资源过了有效期,但服务器上的资源还是旧的,此时并不需要重新发送。缓存校验就是用来解决这些疑问的,在 11 中,我们主要关注下Last-Modified 和 etag 这两个字段。

Last-Modified

服务端在返回资源时,会将该资源的最后更换时间通过Last-Modified字段返回给客户端。客户端下次请愿时通过If-Modified-Since或者If-Unmodified-Since带上Last-Modified,服务端查验该时间是否与服务器的最后改动时间一致:假如一致,则返回304状态码,不返回资源;假如不一致则返回200和改动后的资源,并带上新的时间。

If-Modified-Since和If-Unmodified-Since的区别是:

If-Modified-Since:通知服务器假如时间一致,返回状态码304

If-Unmodified-Since:通知服务器假如时间不一致,返回状态码412

etag

单纯的以改动时间来判断还是出缺陷,比如文件的最后改动时间变了,但内容没变。对于这样的场合,我们可以采用etag来处置。

etag的方式是这样:服务器通过某个算法对资源进行计算,赢得一串值(相似于文件的md5值),之后将该值通过etag返回给客户端,客户端下次请愿时通过If-None-Match或If-Match带上该值,服务器对该值进行对比校验:假如一致则不要返回资源。

If-None-Match和If-Match的区别是:

If-None-Match:通知服务器假如一致,返回状态码304,不一致则返回资源

If-Match:通知服务器假如不一致,返回状态码412

结算

缓存开关是: pragma, cache-control。

缓存校验有:Expires,Last-Modified,etag。

从状态码的角度来看,它们的关系如下图:

cache-control的各个值关系如下图

站長聲明:以上關於【性能优化浅谈http中的Cache-Control-萤石云存储服务器地址】的內容是由各互聯網用戶貢獻並自行上傳的,我們新聞網站並不擁有所有權的故也不會承擔相關法律責任。如您發現具有涉嫌版權及其它版權的內容,歡迎發送至:1@qq.com 進行相關的舉報,本站人員會在2~3個工作日內親自聯繫您,一經查實我們將立刻刪除相關的涉嫌侵權內容。