http缓存

前言

之前对http的缓存不够明晰,经常遇到在服务器上更新了文件,网页端却没有加载新文件,而是加载了缓存文件,导致出现各种问题

虽然可以在连接上加入时间戳,让缓存强制失效,但这等同于不使用缓存机制,那么鱼(频繁更新)与熊掌(缓存)能否得兼呢?

1.缓存存在的意义

冗余的数据传输

假设不使用缓存,比如链接上加入时间戳,那么每次打开页面都作为一个新的页面去打开,可能与上一次加载的页面数据相同,但也会 重复请求,那么这多余的数据传输,不仅会增加服务器的压力,而且会使网页端跑更多的流量,这在移动端web开发上是很致命的,而 缓存的意义就是在页面没有发生更新的时候,不进行冗余的数据传输,读取之前缓存的内容就行,减少服务器的压力

带宽瓶颈

缓存的另一个作用就是解决带宽的问题,比如涉及的资源文件较大,那么直接请求服务器加载资源文件必然会占用大量带宽, 而从缓存 中读取相应资源文件就会快很多,这也是间接减少带宽带来的页面加载缓慢问题,不需要更多的带宽就能快速加载页面

瞬间拥塞

缓存的作用之一就是减少了不必要的请求,那么处理网页短时间内高并发的时候,缓存就能突显出其意义,瞬间拥塞指的是短时间内大量 用户对服务器的访问,造成服务器阻塞,无法及时对用户请求做出响应,当然主要解决方案TCP的四种算法(慢开始,拥塞避免,快重传,快恢复 ),缓存只是在一定程度上缓解这种问题

距离时延

除了带宽会对页面加载造成影响,带宽小的加载大文件自然慢,距离也会对页面加载造成影响,这就是传输时延问题,而直接加载缓存也能 解决传输时延问题带来的影响,这是不言而喻的

2.缓存的命中和未命中

缓存未命中

两种情况: 1.缓存必须是在用户访问过一次才能产生,所以第一次访问页面是缓存未命中,直接从服务器上获取资源

2.再次访问通过http首部字段验证不满足使用缓存的条件,比如no-cache

缓存命中

缓存直接命中,这种情况也叫浏览器缓存命中(强缓存命中),这种直接返回状态码200(from cache)(摘录自文献4)

缓存再验证命中

缓存再验证命中,这种也叫做协商缓存命中,在强缓存验证不通过的情况下,会像服务器端发送一个协商缓存验证的信息, 如果此时服务器发现请求资源未修改,则返回状态码304(Not Modified)告知服务器从缓存中获取资源并更新协商缓存信息。 这种情况通缓存未命中的第二种情况相对应。 (摘录自文献4)

3.缓存类型

强缓存

(待补充)

协商缓存

(待补充)

缓存处理逻辑

可以在资源内容发生变化时更改它的网址,强制用户下载新响应。比如添加时间戳 通常情况下,可以通过在文件名中嵌入文件的指纹或版本号来实现 - 例如 style.x234dff.css。 而gulp-rev 2 添加文件指纹 便是一般思路,这样会请求后匹配指纹,如果指纹相同,那么读取缓存, 指纹不同,那么作为新文件拉取。

TIP

给资源文件添加文件指纹

a.png → a-f7ee61d96b.png(文件名方式)

a.png → a.png?v=f7ee61d96b(url参数方式)

参考文献

你应该知道的前端——缓存

http缓存

浏览器缓存知识小结及应用

http爆炸重点学习——缓存