http之缓存

前言

http用于web应用传输数据, 但是呢, 并不是所有的数据都会从源服务器获取, 因为这样有可能浪费宽带, 也增加了服务器的负担, 毕竟多次重复处理相同的请求还是不必要的。 为了解决这个问题, http有了一个叫缓存的东西。 且看下文

一、与http缓存相关的首部字段

通用首部字段

  • Cache-contorl —— 用于控制缓存的行为
  • Pragma——http1.0遗留下来的, 现在为了兼容以前的web应用, 也常常使用

请求首部字段

  • if-Match——比较ETag是否一致
  • if-None-Match——比较ETag是否不一致
  • if-Modified-Since——比较资源最后更新的时间是否一致
  • if-Unmodified-Since——比较资源最后更新的时间是否不一致

响应首部字段

  • ETag——资源的匹配信息

实体首部字段

  • Expires——http1.0的遗留物, 实体过期的时间
  • Last-Modified——资源最后一次修改的时间

关于缓存的几个问题

  1. 缓存存在的地方?//浏览器本地, 缓存服务器
  2. 请求是否允许通过缓存得到响应
  3. 响应是否允许缓存服务器或浏览器本地缓存资源
  4. 判断缓存是否有效
  5. 缓存有效之后的响应是如何的
  6. 缓存无效(过期)之后的处理过程

我们来一一解答上面的问题

1、缓存存在的地方?

缓存可以存在“两个”地方:
1. 缓存服务器
2. 浏览器本地

2、请求是否允许通过缓存得到响应

通用首部字段Cache-Control和Pragma用于控制缓存,
1. 如果报文中有Cache-Control: no-store。 代表真的不使用缓存, 而是直接冲源服务器得到数据

3. 响应是否允许缓存服务器或浏览器本地缓存资源
  1. 如果报文中有Cache-Control: no-store。 代表真的不使用缓存, 而是直接冲源服务器得到数据
4、请求需要到源服务器确定是否有效

请求报文到达源服务器, 不一定会真的获取真实的数据, 而是先判断缓存是否有效(也就是自己有没有修改过该缓存资源), 如果没有就返回304, 然后任然使用缓存资源。

  1. 如果请求报文中有Cache-Control: no-cache.。 代表不直接使用缓存, 要求向原服务器发起请求确认是否有效
  2. 如果报文中有Cache-Control: no-store。 代表真的不使用缓存, 而是直接冲源服务器得到数据
  3. Cache-Control: max-age=0。缓存中max-age的数组如果指定的max-age小, 就直接从缓存中获取。 如果设置为0, 不能为负数的情况下, 不存在比0小, 需要到源服务器确定资源是否有效。
  4. Cache-Control:min-fresh =60。 如果缓存的内容在60s以内不会过期, 就可以直接使用缓存;相反, 则到发送请求到服务器确认是否真的有效
  5. Cache-Control: max-stale。只要资源没有过期超过60s就可以直接使用缓存的资源。 反之, 则发送请求到服务器确认资源是否真的失效了。
响应不允许缓存

Cache-control: no-cache时。 你可以缓存, 但是下次使用时, 必须想我确定
Cache-Control:no-store。 不允许缓存。
Cache-Control:private。 可以缓存, 但是仅仅想特定用户响应
Cache-Control: public。 可以随意缓存, 随意响应。

以上可以缓存的资源, 可能会收到其他值的影响, 例如max-age, expires等。 收到影响, 就按照是否需要到服务器判断资源是否有效

如何判断资源是否有效?

当需要到服务器确认时, 请求首部字段会携带last-modified, ETag到源服务器,源 服务器判断ETag和last-modified是否匹配。

如果有一个不匹配, 则表示所请求的资源已经被改变, 响应新的资源给客户端, 并携带有last-modified和ETag用于下一次判断。

如果都匹配, 表示请求虽然过期,但是并没有真的改变过, 还可以继续使用, 响应304然后继续使用缓存资源

综上 ——盗来的图

来源

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值