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? 的相关文章

  • 如何防止 Angular 2 站点上的浏览器缓存?

    我们目前正在开发一个定期更新的新项目 我们的一位客户每天都在使用该项目 这个项目是使用 Angular 2 开发的 我们面临着缓存问题 也就是说我们的客户在他们的机器上看不到最新的更改 主要是 js 文件的 html css 文件似乎得到了
  • TensorFlow 数据集的函数 cache() 和 prefetch() 有何作用?

    我正在关注 TensorFlow图像分割 https www tensorflow org tutorials images segmentation教程 其中有以下几行 train dataset train cache shuffle
  • 基于超简单静态文件(html)的php站点缓存

    我有一个网站 基本上只显示内容 没有任何表格和后期处理 该网站基于 PHP 并托管在共享主机上 它很少改变 我想为此网站启用缓存 它是共享托管 所以我需要一个解决方案 不使用 Memcached 不需要将我的网站移至 VPS 不要使用APC
  • 现代缓存中的方式预测

    我们知道 就缓存命中时间而言 直接映射缓存优于集合关联缓存 因为不涉及特定标签的搜索 另一方面 组关联缓存通常比直接映射缓存具有更好的命中率 我读到 现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点 他们预测给定集合中最有可能发
  • IISreset和应用程序池回收对缓存的影响有什么区别

    我遇到了一个奇怪的问题 据我所知 可以通过回收应用程序池来清除缓存 然而 在最近的一个项目中 缓存并没有以这种方式清除 相反 我们必须重置 IIS 以清除缓存 这些行为之间有什么区别 造成我所经历的差异的原因可能是什么 当您回收AppPoo
  • 当我计划高效缓存多个值时,应该如何实现 Guava 缓存?

    我有一个带有 Guava 的 Java 类LoadingCache
  • Google App Engine - 破坏服务 URL 缓存

    我终于设法让图像在 App Engine 上正确旋转 现在我正在努力绕过缓存的图像 而标准缓存清除技术不起作用 因此 第一次旋转图像时 我得到了一个不同的 URL 并且图像被旋转 第二次旋转它时 我得到相同的 URL 只有在附加 s300
  • Spring Boot,使用 EhCache 进行缓存

    我需要在我的应用程序中缓存一些数据 我正在考虑使用 Ehcache 我有几个问题 Ehcache需要另外一台服务器吗 我需要其他客户端来使用 Ehcache 吗 Ehcache 如何与多个实例配合使用 是否有可能使用 Ehcache 创建类
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 在 SPA 中加载外部脚本和样式文件

    我有一种 SPA 它使用 API 来获取数据 该 SPA 有一些实例 它们都使用通用样式和脚本文件 所以我的问题是 当我更改这些文件中的一行时 我将必须打开每个实例并更新文件 这对我来说真的很耗时 一种方法是将这些文件放在服务器中的文件夹中
  • 使用 NSCache 实现缓存过期

    我正在使用 NSCache 在我的应用程序中实现缓存 我想为其添加过期时间 以便在一段时间后它将获取新数据 有哪些选择以及最好的方法是什么 我应该查看访问缓存时的时间戳并使之无效吗 缓存是否应该通过使用固定间隔计时器自动使自身失效 缓存是否
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 使 Django 1.3.1 中的视图缓存过期

    我正在尝试使模型上的视图级缓存过期post save 这是通过设置的https docs djangoproject com en 1 3 topics cache from olddocs the per view cache https
  • ASP.NET - Google Chrome 缓存 DropDownList 选择

    我的购物车页面上的 Google Chrome 和 Safari 似乎遇到了缓存问题 购物车中有 2 个下拉列表 当您在更改下拉列表中的值后点击结帐按钮时 它会将列表中选择的内容提交到数据库 解释意外的行为有点困难 所以我会尝试一步一步地写
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • 为什么在读取字典时要锁定

    我对我正在阅读的一本关于线程的书 C 3 in a Nutshell 中的代码列表感到困惑 在 应用程序服务器中的线程安全 主题中 给出了以下代码作为 UserCache 的示例 static class UserCache static
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 控制缓存过期

    通过 Google 网站管理员工具的 PageSpeed 分析器运行我的网页后 它向我报告我的资源没有被缓存 下面是我的 htaccess 文件中直接取自 H5BP 的代码 我是否正确地假设以下过期时间设置正确 但我的实现中出现了问题 或者
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行

随机推荐

  • 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 中 请求很便宜 所以我们可以在不清除缓存的情况