HTTP/2 中是否有必要缓存bust?

2023-12-27

在 HTTP/1 中,为了避免额外的网络请求来确定资源是否应该保留缓存,我们将设置一个高值max-age or Expires静态资产的值,并为每个修订版提供唯一的 URL。但在 HTTP/2 中,请求很便宜,所以我们可以在不清除缓存的情况下仅依赖 ETag、last-modified 等吗?

我认为继续破坏缓存(除了双重服务 HTTP/1 和 HTTP/2 客户端之外)的唯一好处是在资源过期时节省带宽检查。即使这对于 HPACK 来说也可能微不足道。那么我是否遗漏了一些东西,或者我现在可以停止缓存破坏吗?


“必要”部分取决于您对性能的感受有多极端。简而言之,如果您可以忍受三到四次往返,则不需要缓存清除。否则,缓存清除仍然是删除这些内容的唯一方法。

以下是与 HTTP/2 与 HTTP/1.1、延迟问题以及 HTTP/2 Push 的使用相关的一些争论。

HTTP/2 请求不是即时的

  • HTTP/2 请求比 HTTP/1.1 便宜,但也不是太多。在 HTTP/1.1 中,一旦浏览器打开到服务器的六到八个 TCP 连接,它就有六到八个通道来进行重新验证。在一些 TCP 丢包率高、延迟高的场景中,尤其是在 TCP 慢启动占主导地位的连接开始时,HTTP/1.1 的多个 TCP 套接字比单个 HTTP/2 TCP 连接工作得更好。 HTTP/2 很好,但不是灵丹妙药。

  • HTTP/2 连接仍然存在网络延迟。我们一直在计算我们网站访问者的平均往返时间 (RTT) (可以使用 HTTP/2 Ping 进行测量 https://www.shimmercat.com/en/info/articles/forwarded-header/#client-latency-latency-)并且因为并非每个人都与我们的服务器位于同一块中,所以我们的平均 RTT 在 200 到 280 毫秒之间。 304 重新验证将花费 1 RTT。在不使用资产串联的站点中,资产树的每个新级别都将花费更多的 RTT。

HTTP/2 Push 可以在与缓存良好配合的同时为您节省尽可能多的 RTT。但还有一些问题,请继续阅读!

HTTP/2 推送最适合缓存清除

理想的情况是服务器不推送新资源,而是推送自客户端上次访问以来发生更改的所有内容。

  • 如果浏览器认为资源是新鲜的(例如,因为max-age),它拒绝或不对该资源使用任何推送。这使得不可能通过 HTTP/2 Push 刷新浏览器认为是新鲜的资产。

  • 由于浏览器中存在广泛的错误,推送 304 重新验证不起作用。这些将需要一个小max-age.

因此,将 RTT 保持在最低限度、不推送浏览器已有的任何内容并仍然能够推送资产的新版本的唯一方法是使用缓存清除,即为新版本的资产使用新名称或查询参数。资产。

See also

仍然需要 URL 查询参数来更新客户端的资产 https://www.shimmercat.com/en/info/articles/caching/#url-query-parameters-are-still-needed-to-update-assets-at-clients-

与浏览器缓存的交互 https://www.shimmercat.com/en/blog/articles/whats-push/#interaction-with-the-browser-s-cache

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP/2 中是否有必要缓存bust? 的相关文章

随机推荐

  • C++ 模板运算符编译错误

    我正在尝试创建一个类似的 C 类std ostream 这将获取其输入并写入两个std ostreams 在构造函数中给出 这里它与适当的operator lt lt 模板 struct SplitStream SplitStream st
  • 哈德逊“聚合下游测试结果”的问题

    我的 Hudson 项目似乎没有正确聚合下游测试结果 我想知道我是否错过了某个地方的配置步骤 我有两个项目 Foo 和 Foo Tests 这两个项目都是自由式作业 在项目 Foo 上我有以下配置 选中 聚合下游测试结果 在上一个选项下选中
  • Winsock 仅在程序关闭时发送数据

    我有一个 C Windows 程序 它通过 WM COPYDATA 消息从另一个 C 程序接收数据 然后应该使用 Sockets winsock 将此消息发送到用 Java 编写的服务器 客户端与服务器的连接正常 但似乎无法及时发送消息 然
  • 出现错误:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误

    我是新手开发者 我在尝试从我的计算机连接到 SQL Server 到服务器计算机时遇到问题 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误 服务器未找到或无法访问 验证实例名称是否正确以及 SQL Server 是否
  • Highcharts 上下文菜单按钮在同一图表中出现三次

    I am creating a highcharts But when the chart finishes loading i can see 3 buttons for context menu and only one of them
  • 我如何了解我的库是什么标准以及 gcc 在我的计算机中编译的标准是什么?

    这是来自我的终端 Korays MacBook Pro koraytugay gcc version Configured with prefix Library Developer CommandLineTools usr with gx
  • 为什么 (0 < a < 5) 这样的条件总是成立?

    我用C实现了以下程序 include
  • 使用 Selenium 测试 Angularjs 应用程序

    我正在测试 Angular js 应用程序 Link Angular js 应用程序 http iarouse com demo index html product square 当我单击 Web 应用程序上的 UI Kit 链接时 出现
  • Interface Builder 中的 PNG 透明度

    我在 Interface Builder 中添加一个带有透明 PNG 导航栏中的徽标 的图像视图 但透明像素似乎呈现为白色 我在 Interface Builder 中搜索了 PNG 但没有成功 有小费吗 确保视图属性的 绘图 部分中的 不
  • Git 日志:致命对象 [sha1] 已损坏

    有什么方法可以修复我的存储库并保持提交历史记录完好无损 git log fatal object 01aeb2bf2e93b238f0e0422816b3e55518321ae7 is corrupted 从阅读下面的链接来看 我似乎要删除
  • Asp.net Mvc3 webgrid 和分页

    我正在尝试学习Asp net mvc 我知道它与形式不同 我可能需要改变我的思维方式 我的问题是关于 webgrid 的 当我将 webgrid 添加到我的页面并使用 Post 按下搜索按钮时 它会使用寻呼机等呈现表格 但是寻呼机上的链接不
  • Linux 内核中 IRQ 和中断向量之间的区别

    当涉及到内核 API 的工作时 我对 IRQ 和向量有点困惑 我想使用向量 0xfa 进行一些由可编程 lapic 生成的中断处理 我查看了 API 例如request irq and set intr gate also alloc in
  • 结合 Git Bash 并在 CMDER 中的当前文件夹中打开

    请描述我 谁有这样的经验 如何正确设置CMDER的选项以在当前文件夹中使用Git Bash打开新控制台 例如在此处打开CMDER 该字符串不起作用 C Program Files x86 Git bin sh exe login i new
  • 使用来自存储 C#.Net CNG 的密钥进行 ECDSA 签名文件

    我正在尝试使用 CNG API 和 Microsoft 证书存储中的证书通过 ECDSA 签署文件 我已经阅读了大量文档并且即将完成 但我对从证书导入私钥感到困惑 我已经用 RSA 做了同样的事情 但它的做法似乎非常不同 这是我到目前为止的
  • bash 中的 for 循环只是打印 n 次命令而不是重复

    我有一个包含 6000 多行的 input txt 文件 如果一行 a 包含超过 10 个单词 那么我希望将其拆分 但不是在第 10 个单词处 而是在第一个逗号字符出现的位置处 并且 如果新行也有超过10个单词 那么它也应该被拆分 并不断重
  • 堆叠特征中 super 的含义取决于调用站点?

    我无法用语言对此进行很好的描述 所以 请看这个例子 trait Base def foo Base trait One extends Base override def foo One lt super foo trait Two ext
  • Emacs 中的缓冲区切换

    我想模拟 Alt Tab 因为它适用于 GTK 上的各个窗口 但在 emacs 中的缓冲区内使用 Ctrl Tab 因此 举例来说 如果我在 emacs 中打开了 10 个缓冲区 而我目前正在处理两个缓冲区 例如 Buffer1 和 Buf
  • 企业库错误

    我收到有关我们的生活环境中罕见的间歇性错误的报告 我试图重现它但没有成功 而且这个错误本身有点神秘 除此之外 它似乎涉及企业库跟踪 我们使用的是 5 0 版本 总而言之 有点痛苦 这发生在 Windows Sever 2008 上 应用程序
  • Windows 8 应用程序本地存储

    我正在尝试使用 C 开发 Windows 8 应用程序 我需要在本地设置中存储两个列表 字符串和日期时间 List
  • HTTP/2 中是否有必要缓存bust?

    在 HTTP 1 中 为了避免额外的网络请求来确定资源是否应该保留缓存 我们将设置一个高值max age or Expires静态资产的值 并为每个修订版提供唯一的 URL 但在 HTTP 2 中 请求很便宜 所以我们可以在不清除缓存的情况