Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第十二题:http缓存策略 #12

Open
Ray-56 opened this issue Aug 22, 2019 · 2 comments
Open

第十二题:http缓存策略 #12

Ray-56 opened this issue Aug 22, 2019 · 2 comments

Comments

@Ray-56
Copy link
Owner

Ray-56 commented Aug 22, 2019

http 缓存策略

@GenXiaoLe
Copy link
Collaborator

什么是http缓存

在用户访问网站第一次进行请求的时候,会将请求数据储存在某个可以快速到达和读取的仓库,再重新请求的时候就会调用仓库里的数据。

http缓存的意义

  1. 提升数据交换的性能(速度)
  2. 缓解服务器或数据库的压力

http的缓存策略

  • 简单的来说,就是第一次请求的时候,服务器会将请求的数据缓存起来,再次请求的时候,会通过一些方法对比,决定从缓存里面取出数据,还是重新请求。说到这里就要提到两个字段ExpiresCache-Control,这两个字段表示缓存数据的有效期,在决定是否缓存的时候,首先要对比的就是这两个字段是否还在有效期内。
  • 复杂一点说,其实http的缓存策略分为两种:强缓存和对比缓存(又称协商缓存):
    • 强缓存是会直接从缓存仓库中将数据取出来,无需再次请求数据,使用到的就是上述ExpiresCache-Control这两个字段,方式是比较有效期,Cache-Control的优先级更高。强缓存的状态码为200,并且在200后通常会有注释from memory cache(缓存资源在内存中,浏览器关闭后内存中的缓存就会被释放,重新打开页面取不到该缓存。)或者from disk cache(缓存资源在硬盘中,浏览器关闭后硬盘中的缓存不会消失,下次进入页面还能从硬盘中获取)。
    • 对比缓存是需要经过服务器确认是否使用缓存的机制,其http状态码为304。这里涉及到的概念是Last-Modified / If-Modified-SinceEtag / If-None-Match这两种对比标志。
      • Last-Modified / If-Modified-Since当浏览器第一次访问一个资源的时候,服务器会在response header中返回一个Last-Modified,代表这个资源最后的修改时间,当浏览器再次访问这个资源的时候,会在request header中带上 If-Modified-Since,值为上次请求时服务器返回的 Last-Modified 的值,然后服务器根据资源上次修改的时间确认资源在这段期间内是否更改过,如果没有,则返回304,如果有,则返回200并返回最新的资源。
      • Etag / If-None-Match, 与Last-Modified / If-Modified-Since 的机制类似,不同的是,Etag是通过一个校验码来对比资源是否更改过的,而不是通过资源的修改时间。当一个资源修改时,其校验码也会更改。当浏览器请求资源时,服务器会返回一个Etag字段,然后浏览器下一次请求时,会带上 If-None-Match ,值为上次服务器返回的Etag的值,服务器经过校验码的对比后决定返回200或304。

@MMmaXingXing
Copy link

什么是缓存

 浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力。(简言之,就是告诉浏览器在约定的这个时间前,可以直接从缓存中获取资源而无需跑到服务器去获取)。

 HTTP缓存机制主要在http响应头中设置,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。

缓存的类别

  浏览器缓存分为强缓存和协商缓存

  • 强缓存
      浏览器不会向服务器发送任何请求,直接从本地缓存中读取文件并返回Status Code: 200 OK;
200 后面会有一些参数 含义是

form memory cache 不访问服务器,一般已经加载过该资源并且缓存在了内存当中,直接从内存中读取缓存数据。关闭浏览器后,数据将不再存在了。

foem disk cache 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,不会随着页面的关闭而释放掉下次打开是同样的。

访问规则,优先访问memory cache,其次是disk cache, 最后是请求网络资源
  • 协商缓存:
      向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的request header通知浏览器从缓存中读取资源。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants