Http缓存机制

Cache缓存

一、http为什么需要缓存?

1,通过网络获取内容,会受速度影响并且开销很大,需要在客户端和服务器之间建立通讯,然后通过传包的方式来进行通讯,受网络速度影响,有可能会响应比较慢,导致前端的展示体验不好;

2,减少开销,如果每一次请求都从服务器取的话,那么服务器将会面临巨大的压力,有可能会挂掉,导致访问不了;

3,使用缓存还可以减少网络带宽的占用,过多的请求会导致网络阻塞,从而相应速度也变慢;

4,减少无意义的重复请求,比如某个页面的数据,运营一天才会去修改一次,但是我每次进来这个页面都去从服务器请求数据,这样是没有意义的,只会导致资源的浪费;

所以使用缓存可以大大的提升响应速度,降低服务器压力,减少带宽的占用,因此HTTP的缓存是至关重要的;

二、http的缓存机制

1,通过 ETag 验证缓存的响应

(1)ETag是什么?
ETag 本质上是一个header,也被称为验证令牌,是由服务器根据根据文件生成的hash值获取其他的某个值;

(2)验证令牌的诞生旨在解决什么问题?

假如我们本地的数据是有缓存时效的,当我们从本地取数据的时候,发现缓存时效过期了,这时候就会去服务器那边取数据,但是此时从服务器取回来的数据和本地的数据是一样的,没有什么变化,只是本地的缓存时效过期了,这时候从服务器取回来的数据就没有 意义了,还浪费了请求所消耗的资源;

那么验证令牌就是为了解决这类问题而诞生的;
(3)验证令牌是怎么解决这类问题的?

前面说了,验证本质上是一个header,我们去服务器取数据的时候会带上这个header,比如 ETag:“xxxxxx”; 服务器收到这个header之后,就会去做验证,如果验证对比了令牌后发现,没有变化,则返回“304 Not Modified”响应,告诉浏览器缓存重点数据没有发生什么变化,可以继续使用,那么我们接受到响应后,更新本地的缓存时效,进而继续使用缓存;

借用官方的图:
在这里插入图片描述

2,Cache-Control 缓存控制

(1)Cache-Control是用来干嘛的?

Cache-Control是用来定义缓存策略的,比如定义某个资源在什么场景下,缓存多长的时间,本质上是一个header;

Cache-Control是在 HTTP/1.1 规范中定义的;

(2)Cache-Control怎么定义缓存策略?

Cache-Control通过header定义的缓存指令来实现缓存策略,比如Cache-Control:max-age = 180;

(3)缓存指令有哪些?

请求指令:

no-cache:会先通过ETag验证令牌和服务器进行通讯,判断服务器的数据是否有修改过,如果有修改过,则使用服务器返回的新的数据,否则的话就取缓存,使用这个指令会和服务器进行一次通讯;

no-store:指令为"no-store"的情况下,一律不进行缓存,都是从服务器取数据,一般用于需要安全的场景或者需要实时刷新的场景;

max-age:表示当前请求的响应体的有效时间为多长,超过了这个时效则从服务器取数据;

public:表示可以被任何中间者(代理服务器,cdn等)或者浏览器缓存数据,通常情况下,public并不是必须的指令,有其他指令(比如max-age)表示了该请求可以被缓存;

private:表示不可以被任何中间者(代理服务器,cdn等)缓存数据,但是浏览器可以缓存该指令的数据;

3、Expires缓存头

Expires相应头包含日期和时间,下次请求时,会将本地时间和这个时间做比较,如果如果缓存有效,则取缓存,但是由于本地时间和服务器时间不同步,用这个来判断缓存时效会存在不准的问题,因此在HTTP1.1之后更多的是使用Cache-Control 指令,更加灵活;

该文章转载自脉脉https://maimai.cn/article/detail?fid=1444036936&efid=H8dM-zbi0LdtwaG5v_33mg&use_rn=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值