HTTP缓存

1、缓存

  缓存是一种保存资源副本,并且在下次请求时直接使用该副本的一项技术。

  当WEB缓存发现请求的资源已经被存储,他会拦截请求,返回该资源的拷贝,而不会去服务器重新下载请求。

  对于网站来说,缓存时达到高性能的重要组成部分。缓存需要合理的配置,并不是所有的资源都是永久不变的,不能缓存过期的资源,资源的生命周期应该截止到资源下一次改变之前。

  http缓存不是必须的,但是重用缓存的资源时必须的。常见的http缓存只能存储GET响应,对于其他类型的响应无能为力。

  缓存的关键是request method和目标URI。

2、缓存的好处
缓解服务器压力,提升性能,减少获取资源的时间。
3、缓存的分类

  缓存分为强缓存和协商缓存。

3-1、强缓存

  强缓存可以通过两种响应头实现,分别为Expires和Cache-Control。强缓存表示在缓存期间不需要请求,且state code的值为200。

  # 【实现】
Expires: time;
    - 表示在指定时间之后过期,需要再次请求;
    - Expires缓存时间的设置受限于本地时间,如果修改本地时间,有可能会导致缓存失效。
    
Cache-Control:max-age=20;
    - 表示资源会在20s之后过期,需要再次请求;
    - 优先级高于Expires;
3-2、协商缓存

  协商缓存需要请求,如果资源有效则会返回304,协商缓存需要客户端和服务端共同实现。

  # 【实现】
Last-Modified和If-Modified-Since:
    - Last-Modified表示本地文件最后的修改日期;
    - If-Modified-Since会将Last-Modified的值发送给服务器,询问服务器该日期之后,资源是否有更新,如果更新则返回新的资源;
    - 但是如果在本地打开缓存文件,就会造成Last-Modified被修改;
    
ETag和If-None-Match:
    - ETag类似于文件指纹;
    - If-None-Match会将当前ETag发送给服务器,询问该资源的ETag是否变动,如果变动就返回新的资源;
    - ETag的优先级高于Last-Modified;
4、缓存的分类2
缓存一般分为私有缓存和共享缓存;
共享缓存存储的响应能够被多个用户使用,而私有缓存只能用于单个用户。
4-1、浏览器缓存
- 浏览器缓存属于私有缓存,只能用于单独的用户;
- 浏览器缓存拥有用户通过HTTP下载的所有文档,这些缓存可以为浏览过的文档提供向前或者向后导航,保存网页、查看源码等功能;可以避免向服务器发起多余的请求。
4-2、代理缓存
- 代理缓存属于共享缓存,可以被多个用户使用;
- 设置一个web代理来作为本地网络基础的一部分提供给用户。热门的资源就会被重复使用,减少网络的拥堵和延迟。
4-3、其他缓存
CDN缓存、反向代理缓存、负载均衡器
5、缓存控制
通过Cache-Control来定义缓存策略。
5-1、禁止缓存

  缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。设置如下:
Cache-Control: no-store;
Cache-Control: no-cache,no-store;

5-2、强制确认缓存

  每次客户端发出请求时,缓存会将此请求发送到服务器,该请求会带有与本地缓存相关的验证字段,服务器端会验证请求中所描述的缓存是否过期,如果没有过期,则缓存才能使用本地缓存;否则就会从服务器重新获取资源。设置如下:
Cache-Control: must-revalidate;

5-3、私有缓存和共享缓存
【public】指令表示该响应可以被任何中间人缓存,比如:中间代理,CDN等。
         如果指定了public,则带有HTTP验证信息的页面或者具有某些特定影响状态码的页面将会被其缓存。
【private】指定表示该响应时专用于某个单个用户的,中间人不能缓存此响应,该响应只能用于浏览器私有缓存中。

设置如下:
    Cache-Control: private
    Cache-Control: public
5-4、缓存过期机制

  【max-age=seconds】表示资源能够被缓存的最大时间,相对于expires而言,max-age时距离请求发起的时间的秒数。

  通常可以给那些不经常改变的文件,设置一定的时长以保证缓存有效,例如:图片、css、js等静态资源。

设置实现:
Cache-Control: max-age=2222222;
5-5、缓存验证确认

  【must-revalidate】指令,表示在使用一个陈旧的资源时,必须先验证它的状态,已经过期的缓存将不在被使用。

设置方式
Cache-Control: must-revalidate
6、缓存约定

  从理论上来讲,当一个资源被缓存存储之后,该资源应该可以被永久存储在缓存中。但是由于缓存的空间有限,所以缓存会定期将一些副本删除,这个过程叫做缓存驱逐。

  由于HTTP是C/S模式的协议,当服务器更新一个资源时,不可能直接通知客户端及其缓存。所以双方必须为该资源约定一个过期时间,超过约定的时间,则该资源就会变为无效的资源。

  然后驱逐算法就会将陈旧的资源替换为新鲜的资源。

  一个陈旧的资源并不会直接被清除或者忽略,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个If-None-Match头,然后发给目标服务器。

  如果服务器返回304,则表示该资源是有效的,客户端就会直接使用缓存资源,可以节省带宽。如果服务器发现该资源已经过期,那么服务器就会将带有该资源的实体内容返回给客户端。

7、缓存的过程

  浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header和该请求的返回时间一并缓存。

  下一次加载资源时,先比较当前时间和上一次返回200时的时间差。如果没有超过Cache-Control设置的max-age,则表示资源没有过期,可以继续使用,命中强缓存,不发请求直接从本地缓存读取该文件;如果浏览器不支持HTTP/1.1,则用Expires判断是否过期;如果资源过期,则向服务器发送header带有If-None-Match和Modified-Since的请求。

  服务器收到请求后,优先根据ETag的值判断被请求的文件有没有被修改,ETag值一致则没有修改,命中协商缓存,返回304;如果不一致,则表示有改动,直接返回新的资源文件,带上新的ETag并且返回200。

  如果服务器收到的请求没有ETag值,则将If-Modified-Since和被请求文件的最后修改时间做对比,一致则命中协商缓存,返回304;不一致则返回新的last-Modified和文件并返回200。

8、TTFB
8-1、什么是TTFB?

  TTFB全称Time to First Byte,指的是浏览器开始收到服务器响应数据的时间,包含后台处理时间和重定向时间,是反映服务器端响应速度的重要指标。TTFB时间越短,说明服务器响应速度越快。

8-2、TTFB过长的原因

  对于动态网页来说,服务器收到用户打开一个页面的请求时,首先要从数据库中读取该页面需要的数据,然后把数据传入到模版中,模版渲染成功之后,再返回给用户。由于查询数据和渲染模板需要一定的时间,在这个过程没有完成之前,浏览器就一致处于等待接收服务器响应的状态。

- 如果服务器性能较低,或者优化没有做好,这个时间就会比较长;
- 如果服务器到用户之间的网络不好,服务器接收到用户请求的时间较长,也会导致TTFB时间过长;
- 用户在浏览器中保存了较多的cookie,每次请求,cookie都会发送到服务器,服务器需要处理这些cookie,也会导致TTFB时间过长;
8-3、解决办法
- 使用缓存,把PHP和mysql的执行时间最小化,缓存SQL查询结果,把十几次查询结果转换为几次;
- 把用户所请求的页面静态化,用户打开网页时,相当于直接从服务器上下载了静态页面;
- 如果是网络原因,则可以替换服务器;
- 可以使用CDN缓存;
- 如果是cookie原因,可以删除不必要的cookie,缩短cookie有效期;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值