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参数方式)