17 | 客户端缓存是如何帮助服务器分担流量的?
周志明
你好,我是周志明。这节课,我们继续来讨论透明多级分流系统中,最靠近用户一侧的分流部件:浏览器的客户端缓存。
当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了。在 HTTP 协议设计之初,人们便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求客户端的每次请求是独立的,每次请求无法感知、也不能依赖另一个请求的存在,这既简化了 HTTP 服务器的设计,也为它的水平扩展能力留下了广阔的空间。
但无状态并不是只有好的一面。因为客户端的每次请求都是独立的,服务端不会保存之前请求的状态和资源,所以也不可避免地导致它会携带重复的数据,造成网络性能的降低。
那么,HTTP 协议针对这个问题的解决方案,就是客户端缓存。从 HTTP/1.0 到 1.1、再到 2.0 版本的演进中,逐步形成了现在被称为“状态缓存”、“强制缓存”(或简称为“强缓存”)和“协商缓存”这三种 HTTP 缓存机制。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
HTTP协议的缓存机制在客户端缓存方面发挥着重要作用,有助于减轻服务器负载并提升网络性能。本文深入介绍了强制缓存和协商缓存两种机制。强制缓存通过Expires和Cache-Control两类Headers实现,其中Cache-Control提供了更丰富的参数定义,支持强制缓存机制的实现。而协商缓存则基于资源的修改时间和唯一标识进行变动检查,通过Last-Modified和If-Modified-Since以及Etag和If-None-Match等Header实现。此外,文章还介绍了HTTP的内容协商机制和Vary Header的作用。通过合理利用客户端缓存,可以有效节省网络流量,为后端系统分流,实现更高并发。总之,本文详细解析了HTTP缓存机制的演进和实现细节,为读者提供了对客户端缓存如何帮助服务器分担流量的深入理解。
该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(15)
- 最新
- 精选
- lmdcx每次看周老师的专栏都有种受虐感, 或者惊叹于老师治学的严谨态度, 把知识脉络梳理的秋毫必现 -------------- 不过我这次好像发现了一点小问题: "这个“最差”体现在每次请求时,服务端都必须对资源进行哈希计算" 这也未必吧,还是看具体实现吧,如果是每次资源变化时才更新 Etag, 我觉得其实性能未必差太多吧? 比如老师文中也提到了: Apache 服务器的 Etag 值,就默认是对文件的索引节点(INode)、大小和最后修改时间进行哈希计算后而得到的. 那它的哈希计算时间点就应该是最后修改时间, 而不是每次请求. --------------- 最后,请求一下小编,你们的留言框(我说的是 PC 端)能否改大些,长文输入比较麻烦
作者回复: 先感谢认可哈。 “那它的哈希计算时间点就应该是最后修改时间, 而不是每次请求.” 如果文件每次变更,可以由文件系统来计算一次Hash,然后存储到文件系统的某个位置,供后续应用使用,那确实在修改时计算是最佳的。但是文件系统并未做出这样的支持,如果这件事情要由Web服务器来做的话,似乎就只有通过inotify来监视文件变化这种方式了,这样的消耗反而得不偿失。所以目前一般是请求时计算,最多辅以短时间的缓存措施来缓解。 最后,留言框的体验确实不好,尤其是对于作者需要回复多个读者时确实挺痛苦的。另一块需要改进的是读者对作者已回复的留言提交了新的回复时,作者无法从后台中看到,只能前台点开留言去看,这个当发现了之后往往也过了时效性。
2021-01-0110 - 刘智恒我想确认一下,无状态指的是不是无“客户端短暂的会话状态”。长期的需要持久化的业务状态(比如用户购买的课程)是不方便做无状态化的。
作者回复: 在介绍REST的课程中解释过无状态的概念,可以参考一下。
2020-12-27 - 心之翥请问周老师,我在做服务端编程的时候,一般比较少去设置这些缓存配置参数。是否web服务器或代理服务器帮助我们做了这些事情,所以我们不再需要去对每个资源做繁琐的缓存控制?请帮忙解惑一下,谢谢。2021-11-223
- 大力水手Jerry一课一思:前端的技术发展向后端看起,以前只知道cookie,看了才知道有LocalStorage、SessionStorage,以及IndexedDB,WebSQL等数据库可以用。不过javascript是一种图灵完备语言,且手持终端计算能力已经足以完成相当规模的的运算,出现这些技术很正常。2021-03-132
- zhanydlocalStorage和sessionStorage以前有用到过,第一次知道IndexedDB,现在浏览器都自带数据库了,真是厉害了。 现在前端各种框架都需要编译,打包,部署,而且还自带数据库,感觉前端和后端越来越像了。。。2020-12-252
- Andot对于浏览器隐身模式也都是Cache-Control: non-cache2023-10-30归属地:北京
- return"Etag 和 Last-Modified 是允许一起使用的,服务器会优先验证 Etag,在 Etag 一致的情况下,再去对比 Last-Modified,这是为了防止有一些 HTTP 服务器没有把文件修改日期纳入哈希范围内。" 这样岂不是 性能更差了。2021-12-20
- return"Etag 和 Last-Modified 是允许一起使用的,服务器会优先验证 Etag,在 Etag 一致的情况下,再去对比 Last-Modified,这是为了防止有一些 HTTP 服务器没有把文件修改日期纳入哈希范围内。"2021-12-20
- 星溯最后老师讲的内容协商部分,对于”多个资源“的表述,有些不同看法: 个人理解不能称之为多个资源,而应称为”同一资源的不同版本“,根据RESTful架构风格,URL面向资源,而资源语义由URL来完备地、唯一地确定,不会受Header影响,因此只要URL相同,就应是同一个资源,只是不同版本,有着不同表现形式。2021-04-181
- 言十年localstorage 用了2021-03-27
收起评论