前言缓存对于Web开发有重要作用,尤其是大负荷Web系统开发中 。
MDove:当然即使不是Web开发,缓存的意义也是举足轻重 。拿客户端来说,从硬盘数据库取肯定要比网络获取快,从内存取一定比从硬盘数据库取更快 。虽说HTTP缓存在客户端上的场景并不多见,但是其思想是相通的,学习一波总归没有坏处 。所以今天让我们聊一聊HTTP中的缓存 。
想了解更多关于Web性能优化的知识,请移步:
Web前端性能优化:JAVAScript细节篇
Web前端性能优化:html、css、js篇
高级Web必备:网络优化,拿去镇住面试官
更过更全内容,欢迎star我的GitHub:https://github.com/programmer-zhang/front-end/正文一、缓存的概念知识
- 缓存的分类:服务器缓存(代理服务器缓存、CDN 缓存)、第三方缓存、浏览器缓存等 。
- 缓存的相关术语:
- 缓存命中率:从缓存中得到数据的请求数与所有请求数的比率 。理想状态是越高越好 。
- 过期内容:超过设置的有效时间,被标记为 '陈旧' 的内容 。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内容或者验证缓存的内容是否仍然可用 。
- 验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间或策略 。
- 失效:失效就是把内容从缓存中移除 。当内容发生改变时就必须移除失效的内容 。
- 另: 浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源(极端情况下相当于纯静态页面) 。
- 减少网络带宽消耗
- 降低服务器压力
- 减少网络延迟,加快页面打开速度
- 强缓存优先于协商缓存,强缓存生效则使用强缓存,若强缓存失败,则进行协商缓存
- 协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存
文章插图
缓存策略 图片来源:IMWeb前端
四、涉及缓存机制的HTTP-header4.1、Expires(过期时间)(强缓存机制)
- 值:是一个GMT时间格式的绝对时间,Expires 的日期时间必须是格林威治时间(GMT),而不是本地时间 。举例:Expires: Fri, 30 Oct 1998 14:19:41
- 作用:告诉缓存器相关副本在多长时间内是新鲜的 。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改 。
- 兼容性:几乎所有的缓存服务器都支持Expires(过期时间)属性
- 规则:基于客户最后查看副本的时间(最后访问时间)或者根据服务器上文档最后被修改的时间
- 应用:
- 对于设置静态图片文件(例如导航栏和图片按钮)缓存特别有用;因为这些图片修改很少,你可以给它们设置一个特别长的过期时间,这会使你的网站对用户变得相应非常快
- 对于控制有规律改变的网页也很有用,例如:你每天早上6点更新新闻页,你可以设置副本的过期时间也是这个时间,这样缓存服务器就知道什么时候去取一个更新版本,而不必让用户去按浏览器的"刷新"按钮 。
- 过期时间头信息属性值只能是HTTP格式的日期时间,其他的都会被解析成当前时间"之前",副本会过期
- 局限性:虽然过期时间属性非常有用,但是它还是有些局限,
- 首先:是牵扯到了日期,这样Web服务器的时间和缓存服务器的时间必须是同步的,如果有些不同步,要么是应该缓存的内容提前过期了,要么是过期结果没及时更新 。
- 如果你设置的过期时间是一个固定的时间,如果你返回内容的时候又没有连带更新下次过期的时间,那么之后所有访问请求都会被发送给源Web服务器,反而增加了负载和响应时间
- 值:max-age=[秒] — 执行缓存被认为是最新的最长时间 。
- 相对时间,不是绝对时间
- 单位是秒:从请求时间 开始到过期时间之间的秒数 。
- 作用:让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制 。是http 1.1中为了弥补 Expires 缺陷新加入的 。
- 相关控制字段:
- s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
- public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
推荐阅读
- 面试官:先来聊聊HTTPS原理,再继续下一个问题
- 程序员必学的中间件,消息队列的应用场景与简介
- HTTPS是怎么保证网络通信安全的
- 淘宝卖家最怕什么投诉电话 淘宝商家最怕什么投诉吗?
- API 接口设计规范
- 政和白茶不得不知道的十件事
- C#模拟HTTP请求发送二进制文件
- PHP文件访问时提示http 404错误
- HTTP2.0中的Server Push
- 网络运营人员必须懂得运营思维导图