周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

17 | 客户端缓存是如何帮助服务器分担流量的?

你好,我是周志明。这节课,我们继续来讨论透明多级分流系统中,最靠近用户一侧的分流部件:浏览器的客户端缓存。
当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了。在 HTTP 协议设计之初,人们便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求客户端的每次请求是独立的,每次请求无法感知、也不能依赖另一个请求的存在,这既简化了 HTTP 服务器的设计,也为它的水平扩展能力留下了广阔的空间。
但无状态并不是只有好的一面。因为客户端的每次请求都是独立的,服务端不会保存之前请求的状态和资源,所以也不可避免地导致它会携带重复的数据,造成网络性能的降低。
那么,HTTP 协议针对这个问题的解决方案,就是客户端缓存。从 HTTP/1.0 到 1.1、再到 2.0 版本的演进中,逐步形成了现在被称为“状态缓存”、“强制缓存”(或简称为“强缓存”)和“协商缓存”这三种 HTTP 缓存机制。
这其中的状态缓存,是指不经过服务器,客户端直接根据缓存信息来判断目标网站的状态。以前只有 301/Moved Permanently(永久重定向)这一种;后来在RFC6797中增加了HSTS(HTTP Strict Transport Security)机制,用来避免依赖 301/302 跳转 HTTPS 时,可能产生的降级中间人劫持问题(在第 28、29 讲中,我还会展开讲解这个问题),这也属于另一种状态缓存。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
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-01
    10
  • 刘智恒
    我想确认一下,无状态指的是不是无“客户端短暂的会话状态”。长期的需要持久化的业务状态(比如用户购买的课程)是不方便做无状态化的。

    作者回复: 在介绍REST的课程中解释过无状态的概念,可以参考一下。

    2020-12-27
  • 心之翥
    请问周老师,我在做服务端编程的时候,一般比较少去设置这些缓存配置参数。是否web服务器或代理服务器帮助我们做了这些事情,所以我们不再需要去对每个资源做繁琐的缓存控制?请帮忙解惑一下,谢谢。
    2021-11-22
    3
  • 大力水手Jerry
    一课一思:前端的技术发展向后端看起,以前只知道cookie,看了才知道有LocalStorage、SessionStorage,以及IndexedDB,WebSQL等数据库可以用。不过javascript是一种图灵完备语言,且手持终端计算能力已经足以完成相当规模的的运算,出现这些技术很正常。
    2021-03-13
    2
  • zhanyd
    localStorage和sessionStorage以前有用到过,第一次知道IndexedDB,现在浏览器都自带数据库了,真是厉害了。 现在前端各种框架都需要编译,打包,部署,而且还自带数据库,感觉前端和后端越来越像了。。。
    2020-12-25
    2
  • Andot
    对于浏览器隐身模式也都是Cache-Control: non-cache
    2023-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-18
    1
  • 言十年
    localstorage 用了
    2021-03-27
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部