沫延说
沫延说
使用http响应头Cache-Control字段提高缓存命中率降低服务器负载
使用http响应头Cache-Control字段提高缓存命中率降低服务器负载

前言

缓存对于浏览器来说,是一项必不可少的功能,与其每次都要走完整个页面访问流程,倒不如把访问过的页面缓存下来,只要在缓存有效期内,不影响实时性,我就直接调用本地缓存,节省了家庭网络带宽,还能提升响应速度和打开效率,尤其是在网络环境不好的情况下,更能极大改善用户浏览网页体验。

那么问题来了,如何确定缓存在有效期内呢?

答案就是http响应头中的Cache-Control字段

 

Cache-Control字段可用内容和作用

1.可用内容

Cache-Control是缓存请求指令缓存响应指令

在服务端中,作为缓存响应指令可以设定指令为:

Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>

在客户端中,作为缓存请求指令可以设定指令为:

Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache 
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached

当然了,还有一些拓展指令,可能存在兼容性问题:

Cache-control: immutable 
Cache-control: stale-while-revalidate=<seconds>
Cache-control: stale-if-error=<seconds>

2.作用

2.1缓存设置

public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)

private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。

no-cache
在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)。

no-store
缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。

2.2到期设置

max-age=<seconds>
设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。

s-maxage=<seconds>
覆盖max-age或者Expires头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它。

max-stale[=<seconds>]
表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。

min-fresh=<seconds>
表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。

stale-while-revalidate=<seconds> 
表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。

stale-if-error=<seconds> 
表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。

其中最后两项是实验性的配置,不保证兼容性,并不建议在生产环境下使用。。。

2.3重载和验证

must-revalidate
一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。

proxy-revalidate
与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。

immutable 
表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如If-None-Match或If-Modified-Since)来检查更新,即使用户显式地刷新页面。

其中最后一项是实验性配置,不保证兼容性,并不建议在生产环境下使用。

2.4其他

no-transform
不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等HTTP头不能由代理修改。例如,非透明代理或者如Google's Light Mode可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。no-transform指令不允许这样做。

only-if-cached
表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。

 

示例

1.不允许缓存

Cache-Control: no-store

需要注意此时的不允许并不代表一定不缓存,守规矩的浏览器会执行这种指令,

其中守规矩的浏览器指大厂出的国际认可的浏览器,例如Chrome等…

2.设定过期时间的允许缓存

Cache-Control:public, max-age=31536000

31536000为秒数,这是代表着可以缓存一年

3.本站

本站使用的缓存有些复杂,

首先允许缓存,DOMContent过期时间为180秒,也就是说你现在所看到的的页面缓存有效期为三分钟,过了三分钟再次访问就不能从缓存中调用了,这样可以保证页面更改的及时性

而其他静态内容,例如js,css,img,字体等文件,都有着超长的过期时间,毕竟这些文件很少会有改动。

这样做就可以极大限度的提升再次来访用户的访问速度,节省了服务器资源和带宽,提升效率

 

 

感谢您阅读使用http响应头Cache-Control字段提高缓存命中率降低服务器负载

及时获取更多文章,欢迎关注“Topstalk”微信订阅号

Thank you for reading the 使用http响应头Cache-Control字段提高缓存命中率降低服务器负载

Get more articles in time,Welcome to follow the "Topstalk" WeChat subscription account

没有标签
首页      生产环境      优化技术      使用http响应头Cache-Control字段提高缓存命中率降低服务器负载

Morton.L

文章作者

发表评论

textsms
account_circle
email

沫延说

使用http响应头Cache-Control字段提高缓存命中率降低服务器负载
前言 缓存对于浏览器来说,是一项必不可少的功能,与其每次都要走完整个页面访问流程,倒不如把访问过的页面缓存下来,只要在缓存有效期内,不影响实时性,我就直接调用本地缓存,节省了…
扫描二维码继续阅读
2020-12-11