使用浏览器缓存进行增量更新

2024-04-08

客户端(AngularJS 应用程序)从服务器获取相当大的列表。列表可能有数百或数千个元素,这可能意味着未压缩的几兆字节(并且一些用户(管理员)获得更多数据)。

我不打算让客户端获得部分结果,因为排序和过滤不应该打扰服务器。

压缩效果很好(大约为 10)并且列表不会经常更改,304 NOT MODIFIED也有很大帮助。但缺少另一个重要的优化:

由于列表的典型更改相当小(例如,修改两个元素并添加一个新元素),因此传输更改听起来像是一个好主意。我想知道如何正确地做到这一点。

就像是GET /offer/123/items应该总是返回报价编号 123 中的所有商品,对吗?这里可以使用压缩和304,但不能进行增量更新。像这样的请求GET /offer/123/items?since=1495765733听起来像是可行的方法,但是浏览器缓存并没有被使用:

  • 要么什么都没有改变并且答案是空的(并且缓存它没有意义)
  • 或者某些内容发生了变化,客户端会更新其状态,并且自 1495765733 以来不再要求更改(并且缓存它更没有意义)

显然,当使用“since”查询时,不会为“资源”缓存任何内容(原始查询仅使用一次或根本不使用)。

所以我不能依赖浏览器缓存,只能使用localStorage or sessionStorage,它有一些缺点:

  • 它限制为几兆字节(浏览器 HTTP 缓存可能更大并且会自动处理)
  • 当我达到极限时,我必须实施一些替代策略
  • 浏览器缓存存储了我没有得到的已经压缩的数据(我必须重新压缩它们)
  • 它不适用于获得更大列表的用户(管理员),因为即使单个列表也可能已经超出限制
  • 注销时它会被清空(客户的要求)

考虑到有 HTML 5 和 HTTP 2.0,这还不够令人满意。我缺少什么?

是否可以将浏览器 HTTP 缓存与增量更新一起使用?


我认为您缺少一件事:简而言之,标题。我认为你可以做的并且符合(大多数)你的要求的是:

  • First GET /offer/123/items正常进行,没有什么特别的。
  • 随后的GET /offer/123/items将与Fetched-At: 1495765733标头,指示您的服务器何时发送初始请求。

从现在开始,有两种可能的情况。

  • 要么不做任何改变,发送304即可。
  • 但是,如果有更改,则返回新项目,因为先前发送的时间戳具有标头,但设置Cache-Control: no-cache从你的回复来看。

这使您可以进行增量更新,并缓存初始兆字节大小的元素。

但仍然有一个缺点,即缓存仅执行一次,它不会缓存更新。你说你的列表不经常更新,所以它可能已经对你有用,但如果你真的想进一步推动这一点,我可以再想一件事。

收到增量更新后,您可以在后台触发另一个请求,而无需Fetched-At您的应用程序根本不会使用该标头,而只是用于更新您的 http 缓存。它不应该像听起来那么糟糕,因为您的框架不会使用新框架更新其数据(并可能触发重新渲染),唯一值得注意的缺点是网络和内存消耗。在移动设备上这可能会出现问题,但听起来并不像是一个打算在移动设备上显示的应用程序。

I absolutely don't know your use-case and will just throw that out there, but are you really sure that doing some sort of pagination won't work? Megabytes of data sounds a lot to display and process for normal humans ;)

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

使用浏览器缓存进行增量更新 的相关文章

  • 如何在 suave webpart 中设置 Json 响应

    我从 Suave 和 F 开始 我正在尝试在我的 web 部件中传递一个 json 序列化对象以在我的响应中获取它 在 php 中我有这个 player1Key hdegftzj25 gameKey aegfhzkfszl
  • 使 URL W3C 有效并在 Ajax 请求中工作

    我有一个返回 URL 的通用函数 这是一个插件函数 可返回插件内资源 图像 样式表 的 URL 我在这些 URL 中使用 GET 参数 如果我想在 HTML 页面中使用这些 URL 以通过 W3C 验证 我需要将 符号屏蔽为 plugin
  • 有什么方法可以处理 HTTP/2 Goaway 在 HttpClient java 中收到的 IOException 吗?

    我在应用程序中进行 API 调用 在某个时候它会随机抛出java io IOException 149 222 1 1 553232 GOAWAY received 使用Java 11环境 无论如何要解决此异常而不是迁移到 Http 1 1
  • Google 文档自动保存如何工作?

    好吧 我知道这听起来很普通 但我指的是 AJAX 级别 我尝试过使用 Firebug 来跟踪 NET 连接和帖子 但这是一个谜 有谁知道他们如何在不破坏网络 浏览器的情况下不断进行即时自动保存 我的猜测 这只是一个猜测 是谷歌使用推送服务
  • javascript单线程时onreadystatechange的调用者是谁?

    好吧 我是 javascript 的新手 听说它是单线程的 在我看来 如果您发出异步请求 它应该启动一个自己的线程来控制服务器是否已经响应 这在 JavaScript 中不起作用 我在想是否有一些内置机制可以保存所有侦听器并调用它们 具体取
  • jQuery 绑定 ajax:成功无法在 Rails 3 应用程序中为新创建的(ajax)项目工作

    编辑这篇文章是因为我发现问题实际上在于rails无法绑定到ajax success函数 使用导轨3 2 3 感谢您花时间阅读并尝试提供帮助 我在 ajax success 删除项目上添加一个简单的淡出功能 如下所示 document rea
  • 自动完成请求/服务器响应是什么样的?

    这似乎是一个黑洞 经过一个小时的搜索jQuery用户界面 http en wikipedia org wiki JQuery UI网站 Stack Overflow 和谷歌搜索 我还没有找到如何编写的最基本信息服务器端自动完成的 向服务器传
  • 将对象数组作为请求中的 url 参数传递

    我需要将一个对象数组 每个对象有 2 个字段 作为 http 请求的 url 中的参数 我该怎么做以及这个链接应该是什么样子 您可以使用您的结构创建一个 xml 即一个对象数组 每个对象都有两个字段 然后将其转换为字符串 如下所示 举个例子
  • WebAPI如何处理嵌套资源?

    我正在寻找有关使用 WebAPI 2 时最佳实践的意见和建议 假设我有两个控制器 用户和书籍 并且想要接受这些路由 users user id books lt books owned by user id books lt all boo
  • 我可以使用 javascript 捕获并保存网页的当前状态吗

    我需要使用 javascript 获取页面的全部内容并将其发送到服务器脚本以保存它 我想在用户使用 AJAX 和其他 javascript 工具对页面进行一些更改后执行此操作 我不想要某些元素的状态 我想基本上获取 body 标记内的所有内
  • 将数据从 jQuery 传递到 PHP 以进行 ajax post

    你好 我是一个使用 jQuery 和 Ajax 的新手 我正在尝试使用 Jquery POST 方法将数据提交到服务器 我传递的数据是一个字符串 现在我无法理解如何传递数据以及如何检索数据 我尝试搜索有关我的问题的文章 但没有找到 我相信我
  • 所有AJAX请求完成时的JQuery调用函数

    我的问题是问题的变体here https stackoverflow com questions 970967 jquery ajax call function when all requests are complete 然而 有两点不
  • PHP/MySQL/jQuery 记录的悲观锁定

    我一直在考虑为我参与的应用程序开发一些简单的记录锁定 有一些用户实际上需要花费几个小时才能完成记录的编辑 当其他人想要更改记录时 这会导致问题 目前不涉及锁定 我不确定乐观锁定在我的情况下是否可靠 因为记录是通过 AJAX 请求保存的 我正
  • 什么是 Google API 发现?

    我无法理解 Google 产品 服务中使用的 API 发现 概念 以下是一些使用上述发现服务访问 Google Cloud Vision 的 Python 代码 from googleapiclient discovery import b
  • 如何将值从 javascript 传递到 php 文件

    我通过以下方式获取价值JQuery像这样的东西 var query popURL split var dim query 1 split var popWidth dim 0 split 1 Gets the first query str
  • 服务器重新启动时显示等待页面

    我有一个服务器并为其创建一个 Web 界面 如果用户按下页面上的重新启动按钮 则用户将被重定向到reboot php他应该看到一个旋转 gif 直到服务器再次可访问并且服务器通过 shell 执行重新启动 如果服务器可以访问 那么我需要重定
  • Ember 模型中的自定义请求 url

    我正在尝试将 Ember 数据与已构建的 REST api 一起使用 它适用于顶级路由 例如我在 api 端有课程路由 如下所示 app get courses app controllers courses findAll app get
  • 在 Angular 中将图像 url 转换为 base64

    我正在努力尝试将给定的图像 url 转换为 base64 在我的例子中 我有一个带有图像路径的字符串 var imgUrl assets logoEmpresas empresa logoUrl 我如何直接将给定的图像网址转换为base64
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 如何访问模板缓存? - 姜戈

    I am 缓存 HTML在几个模板内 例如 cache 900 stats stats endcache 我可以使用以下方式访问缓存吗低级图书馆 例如 html cache get stats 我确实需要对模板缓存进行一些细粒度的控制 有任

随机推荐