一文带你了解 HTTP 黑科技( 四 )


  • 减轻服务器负载
  • 提升系统性能
下面我们就一起来探讨一下 HTTP 缓存都有哪些
不同类型的缓存HTTP 缓存有几种不同的类型 , 这些可以分为两个主要类别:私有缓存 和 共享缓存 。
  • 共享缓存:共享缓存是一种缓存 , 它可以存储多个用户重复使用的请求/响应 。
  • 私有缓存:私有缓存也称为专用缓存 , 它只适用于单个用户 。
  • 不缓存过期资源:所有的请求都会直接到达服务器 , 由服务器来下载资源并返回 。
我们主要探讨浏览器缓存和代理缓存 , 但真实情况不只有这两种缓存 , 还有网关缓存 , CDN , 反向代理缓存和负载平衡器 , 把它们部署在 Web 服务器上 , 可以提高网站和 Web 应用程序的可靠性 , 性能和可伸缩性 。
不缓存过期资源不缓存过期资源即浏览器和代理不会缓存过期资源 , 客户端发起的请求会直接到达服务器 , 可以使用 no-cache 标头代表不缓存过期资源 。
一文带你了解 HTTP 黑科技

文章插图
 
no-cache 属于 Cache-Control 通用标头 , 其一般的表示方法如下
Cache-Control: no-cache也可以使用 max-age = 0 来实现不缓存的效果 。
Cache-Control: max-age=0私有缓存私有缓存只用来缓存单个用户 , 你可能在浏览器设置中看到了 缓存 , 浏览器缓存包含服务器通过 HTTP 下载下来的所有文档 。这个高速缓存用于使访问的文档可以进行前进/后退 , 保存操作而无需重新发送请求到源服务器 。
一文带你了解 HTTP 黑科技

文章插图
 
可以使用 private 来实现私有缓存 , 这与 public 的用法相反 , 缓存服务器只对特定的客户端进行缓存 , 其他客户端发送过来的请求 , 缓存服务器则不会返回缓存 。它的一般表示方法如下
Cache-Control: private共享缓存共享缓存是一种用于存储要由多个用户重用的响应缓存 。共享缓存一般使用 public 来表示 , public 属性只出现在客户端响应中 , 表示响应可以被任何缓存所缓存 。一般表示方法如下
Cache-Control: public
一文带你了解 HTTP 黑科技

文章插图
 
缓存控制HTTP/1.1 中的 Cache-Control 常规标头字段用于执行缓存控制 , 使用此标头可通过其提供的各种指令来定义缓存策略 。下面我们依次介绍一下这些属性
不缓存no-store 才是真正意义上的不缓存 , 每次服务器接受到客户端的请求后 , 都会返回最新的资源给客户端 。
Cache-Control: no-store缓存但需要验证同上面的 不缓存过期资源
私有和共享缓存同上
缓存过期缓存中一个很重要的指令就是max-age , 这是资源被视为新鲜的最长时间  , 与 Expires 相反 , 此指令是相对于请求时间的 。对于应用程序中不会更改的文件 , 通常可以添加主动缓存 。下面是 mag-age 的表示
Cache-Control: max-age=31536000缓存验证must-revalidate 表示缓存必须在使用之前验证过时资源的状态 , 并且不应使用过期的资源 。
Cache-Control: must-revalidate下面是一个缓存验证图
一文带你了解 HTTP 黑科技

文章插图
 
什么是新鲜的数据一旦资源存储在缓存中 , 理论上就可以永远被缓存使用 。但是不管是浏览器缓存还是代理缓存 , 其存储空间是有限的 , 所以缓存会定期进行清除 , 这个过程叫做 缓存回收(cache eviction) (自译) 。另一方面 , 服务器上的缓存也会定期进行更新 , HTTP 作为应用层的协议 , 它是一种客户-服务器模式 , HTTP 是无状态的协议 , 因此当资源发生更改时 , 服务器无法通知缓存和客户端 。因此服务器必须通过某种方式告知客户端缓存已经被更新 。服务器会提供过期时间这个概念 , 告知客户端在此到期时间之前 , 资源是新鲜的 , 也就是未更改过的 。在此到期时间的范围之外 , 资源已过时 。过期算法(Eviction algorithms) 通常会将新资源优先于陈旧资源使用 。


推荐阅读