HTTP缓存机制
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
HTTP协议中一般使用协议头字段进行缓存控制,缓存分为两种: 强缓存和协商缓存,强缓存的优先级高于协商缓存。 ### **模型:** 用户点击->浏览器检测强缓存(命中则终止)->未命中,发送请求到协商缓存(命中,向服务器发送校验请求)->未命中,请求服务器下发资源,并更新字段值 ### **强缓存** 如果命中缓存,不会与服务器进行通信。 强缓存是一种无验证缓存,一般使用HTTP的头字段expires/cache-control进行控制,expires是HTTP1.0版本的概念,后者是1.1的概念,所以cache-control的优先级又高于expires,功能也更加强大。一般有如下几个字段: 1. max-age 指定缓存的最大有效寿命 2. s-maxage 仅表示public缓存的最大寿命。会覆盖max-age 3. public 表明响应可以被任何对象缓存 4. private 响应只能被单个用户缓存,不能被代理服务器缓存 5. no-cache 强制缓存了该响应的用户,使用缓存前对服务器进行验证 6. no-store 禁止缓存 ### **协商缓存** 不管命中缓存与否,都会和服务器进行通信。缓存到期了,并不意味着内容改变了,所以客户端需要要求服务器进行验证一下。 一般使用一下两种方案: 1. 第一种: - Last-modified 服务器资源的最后修改时间,发送给客户端,客户端记录这个字段,下次请求时,将该字段值附带发送给服务器,与If-Modified-Since字段进行对比看是否需要更新资源。 - If-Modified-Since: 服务器端的资源最后修改时间,客户端的请求头部中包含了Last-modified 字段则与该字段进行对比,若服务器端的修改时间大于客户端知道的修改时间,则将新的修改时间下发给服务器,并将最新的资源下发给客户端。修改过返回200,未修改过返回304。 2. 第二种: Etag/If-None-Match 原理与第一种方法相同,但是验证的字段不同,服务器将资源计算hash值,通过响应字段Etag下发给客户端,客户端以后向服务器进行验证时带上Etag字段值,服务器上资源若进行了更改,则hash值改变,If-None-Match 表示服务器端的对应资源的hash值,两者进行比较,若相同则返回304,不同则更新hash和资源给客户端。 两种方案的对比: - 有可能出现文件的修改时间改变了,但是内容并未更改,这时使用hash验证避免了资源浪费 - 有可能服务器无法准确计算出资源修改的时间,无法使用第一种验证方法 - Last-Modified只能精确到秒, - Etag方法需要着重保证数据的一致性,有可能在负载均衡和反向代理后不一致,并且计算hash会消耗cpu资源。 ### **缓存的使用** 静态文件使用缓存更加合适: 如前端代码html,css,js文件,一些图标logo, 一些下载的资源。 对于可能经常变动的文件,将强缓存寿命设置为0. [HTTP 缓存一二三](https://zhuanlan.zhihu.com/p/29750583)
Pre:
mysql 索引,视图,数据导入导出,备份和恢复
Next:
异常