【发布时间】:2017-05-26 03:07:30
【问题描述】:
客户端(AngularJS 应用程序)从服务器获取相当大的列表。这些列表可能包含成百上千个元素,这可能意味着有几兆字节未压缩(并且一些用户(管理员)会获得更多数据)。
我不打算让客户端获得部分结果,因为排序和过滤不应该打扰服务器。
压缩效果很好(大约 10 倍),并且由于列表不经常更改,304 NOT MODIFIED 也有很大帮助。但是缺少另一个重要的优化:
由于列表的典型更改相当小(例如,修改两个元素并添加一个新元素),因此转移更改听起来是个好主意。我想知道如何正确地做到这一点。
GET/offer/123/items 之类的东西应该总是返回报价编号 123 中的所有项目,对吗?这里可以使用压缩和304,但不能增量更新。像 GET /offer/123/items?since=1495765733 这样的请求听起来像是要走的路,但是浏览器缓存没有被使用:
- 要么什么都没有改变,答案是空的(缓存它没有意义)
- 或发生了某些变化,客户端更新其状态,并且自 1495765733 以来不再请求更改(缓存它更没有意义)
显然,当使用“since”查询时,不会为“resource”缓存任何内容(原始查询只使用一次或根本不使用)。
所以我不能依赖浏览器缓存,只能使用localStorage 或sessionStorage,它们有一些缺点:
- 它被限制在几兆字节(浏览器 HTTP 缓存可能更大,并且会自动处理)
- 当我达到极限时,我必须实施一些替换策略
- 浏览器缓存存储了我没有得到的已压缩数据(我必须重新压缩它们)
- 它不适用于获得更大列表的用户(管理员),因为即使是单个列表也可能已经超出限制
- 它在注销时被清空(客户的要求)
鉴于有 HTML 5 和 HTTP 2.0,这很不令人满意。我错过了什么?
是否可以将浏览器 HTTP 缓存与增量更新一起使用?
【问题讨论】:
-
为什么不分两个阶段做请求呢?首先,请求新的 id,带有可选的
since过滤器,不可缓存。然后,通过包含 id 作为查询参数,请求完整的项目列表,包括项目详细信息,作为完整的可缓存请求。 -
@ConstantinGALBENU 我看不出它有什么帮助。当我包含所有 id 时,我会获取整个列表,这是我需要避免的。当我只包含新 id 时,我会收到一个我再也不需要的请求,因为下一次会有不同的新 id。
-
您在服务器端使用哪种语言来处理这些请求?
-
@JoeCoder Java(嵌入式 Jetty Servlet)。
标签: ajax rest http caching single-page-application