当前位置: 首页 > Web前端 > JavaScript

HTTP缓存

时间:2023-03-27 01:24:06 JavaScript

前言缓存是一种保存资源副本并在下一个请求中直接使用该副本的技术。我们使用HTTP缓存通过缓存资源的复用减少客户端等待时间和网络流量,同时也减轻了服务器的压力。可以显着提高我们网站和应用程序的性能。虽然HTTP缓存不是必需的,但复用缓存资源往往是必要的,HTTP缓存是Web性能优化的重要手段。HTTP缓存的种类一般HTTP缓存策略分为两种:强缓存协商缓存。从字面意思我们可以直观看出区别:强缓存就是强制直接使用缓存。协商一个缓存,就得和服务器协商,确认这个缓存是否可以使用。强缓存强缓存不会向服务器发送请求,而是直接从缓存中读取资源。在chrome控制台的network选项中,可以看到请求返回状态码200,大小显示fromdiskcache或frommemorycache;negotiationCachenegotiation缓存会先向服务器发送请求,服务器会根据请求的请求头的一些参数来判断是否命中了协商缓存。如果命中,会返回一个304状态码,并带上新的响应头,通知浏览器从缓存中取回。阅读资源。HTTP缓存控制在HTTP中,我们可以通过设置响应头和请求头来控制缓存策略。可以通过设置Expires和Cache-Control响应头来实现强缓存。如果两者都存在,则Cache-Control优先级高于Expires。ExpiresExpires响应头,是HTTP/1.0的产物。表示资源的过期时间,它的值是一个绝对时间。它告诉浏览器在过期时间之前直接从浏览器缓存中访问数据。由于是绝对时间,客户端和服务端的时间差异或错误等因素可能会导致客户端和服务端的时间不一致,从而导致缓存命中错误。如果在Cache-Control响应标头中设置了max-age或s-max-age指令,Expires将被忽略。过期时间:2015年10月21日星期三07:28:00GMTCache-ControlCache-Control出现在HTTP/1.1中。可以通过指定多个指令来实现缓存机制。主要用于表示资源缓存的最大有效时间。即在这个时间段内,客户端不需要向服务端发送请求。优先于Expires。其过期时间指令的值为相对时间,解决了绝对时间带来的问题。Cache-Control:max-age=315360000Cache-Control有很多属性,不同的属性有不同的含义。Cacheabilitypublic表示响应可以被任何对象缓存(包括:请求客户端、代理服务器等)。private表示响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存)。no-cache不使用强缓存,需要和服务器协商缓存验证。无存储缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用缓存。Expirationmax-age=缓存存储的最大期限,超过这个期限就认为过期了。s-maxage=设置共享缓存。会覆盖max-age和expires,privatecache会忽略它给定的时间。min-fresh=客户端希望在指定时间内得到最新的响应。revalidate和reloadmust-revalidate如果页面过期了,去服务器端获取。proxy-revalidate与must-revalidate相同,但用于共享缓存。其他only-if-cached不做网络请求,根本只使用缓存。no-transform不转换和转换资源。例如,不得转换图像格式。协商缓存可以通过两对HeadersLast-Modified/If-Modified-Since和ETag/If-None-Match来控制。Last-Modified、If-Modified-SinceLast-Modified和If-Modified-Since的值都是GMT格式的时间字符串,代表文件的最后修改时间。当服务器响应请求时,会通过Last-Modified告诉浏览器资源的最后修改时间。当浏览器再次请求服务器时,请求头中会包含Last-Modified字段,后面是在缓存中获取的最后修改时间。服务器收到这个带有if-Modified-Since的请求头,与请求资源的最后修改时间进行比较,如果一致则返回304和响应头,浏览器只需要从缓存中获取信息即可。如果已经被修改,则开始整体传输响应,服务器返回:200OK但是这种情况在服务器上经常发生,一个资源被修改了,但是它的实际内容却完全没有改变,因为最后-修改时间与上面不匹配将整个实体返回给客户端(即使客户端缓存具有完全相同的资源)。为了解决这个问题,HTTP/1.1引入了Etag。Etag具有高优先级和Last-Modified。Etag和If-None-MatchEtag是服务器为每个资源生成的唯一标识符。和指纹一样,资源的变化会引起ETag的变化。它与最后修改时间无关。ETag可以保证每一个资源都是唯一的。当浏览器发起请求时,浏览器的请求头中会包含If-None-Match字段,其值为上次返回并发送给服务器的Etag。服务端收到第二条消息后,发现If-None-Match与请求资源的唯一标识进行了比较。如果相同表示资源没有被修改,则响应返回304,浏览器直接从缓存中获取数据信息。如果不同,说明资源已经改变,然后响应整个资源内容,返回状态码200。总结通过上一篇文章,我们了解到HTTP缓存主要分为:强制缓存协商缓存。强制缓存由Cache-Control、Exipres(HTTP1.0)控制。浏览器直接读取本地缓存,不会与服务器交互,状态码为200。协商缓存由Last-Modified/IfModified-Since,Etag/If-None-Match实现。每次请求都需要让服务器判断资源是否有更新,从而判断浏览器是否使用了缓存。如果是则返回304,否则重启完成响应。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!