缓存的目的:
重用已获取的资源能够有效的提升网站与应用的性能。Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间。借助 HTTP 缓存,Web 站点变得更具有响应性。
缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处有:缓解服务器端压力,提升性能(获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。
Cache-Control:
Cache-Control: no-store
缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。
Cache-Control: no-cache
此方式下,每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回304),则缓存才使用本地缓存副本。
Cache-Control: max-age=31536000
过期机制中,最重要的指令是 "max-age=<seconds>",表示资源能够被缓存(保持新鲜)的最大时间。相对Expires而言,max-age是距离请求发起的时间的秒数。针对应用中那些不会改变的文件,通常可以手动设置一定的时长以保证缓存有效,例如图片、css、js等静态资源。
ETag:
该响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。
一般配合MD5使用,MD5是消息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
语法:ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服务器将客户端的ETag(作为If-None-Match字段的值一起发送)与其当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器将返回不带任何内容的304未修改状态,告诉客户端缓存版本可用(新鲜),请求响应报文如下:
响应 请求Cache-Control:缓存 与 ETag 的「缓存」有什么区别?
Cache-Control: max-age=1000 :请求完成,响应完毕后,响应体保存一百秒,时间一到缓存就没有啦,需要从新请求服务器,去拿对应的数据。100秒期间,浏览器不会再次发送任何请求,只在本地缓存拿数据。
ETag:对比本地与服务器端的MD5返回值,若一致,不需要重新加载响应体,若不一致(说明文本发生了改变)则重新下载响应体。当数据没发生改变的时候,每次请求虽然不会重新加载响应体,但是还是发送了请求。
如果资源没过期,前者根本不会发送请求,后者会发送请求。
PS:
①,作为入口,html是不能做缓存的,html有很多url,如果缓存的话,JS,CSS等发生更新变化,用户不能第一时间获取最新的版本。
②,如果缓存内容在设置的过期时间内发生变动,需要更改请求路径,当路径发生改变,浏览器就会重新求情。
网友评论