缓存排序/属性可以更改的分页结果的最佳实践是什么?


11

缓存排序/属性可以更改的分页搜索结果的最佳实践是什么?

假设在我的应用程序中,有人想要查看最近的20个讨论线程(在10,000个线程中)。一个请求将通过发送到数据库,servlet以XML / JSON形式从讨论线程表中获取前20条记录。如果他们随后要查看下一个20,则转到结果的下一页,这会触发另一个请求以获取下一个批次(限制和偏移= 20,依此类推)。

为了减少服务器负载和客户端等待,我想缓存结果的前几页。但是,我有两个问题:

  1. 结果显示的表可以按多个属性(即,线程创建日期,线程作者,最后发布日期)排序。这意味着没有上下文(即我们排序的依据)之类的“前20个结果”这样的语句是没有意义的。然后,前端如何与后端通信已加载的内容?我的第一个想法是对每个结果使用ID,但是在随后的请求中将它们发送回服务器(并根据它们过滤结果)就像将所有内容盲目地发送回一样耗时。我怎样才能做到这一点?
  2. 如果先前返回的结果的属性(即最新日期)改变了怎么办?然后,我们需要一种检查每个结果的方法,以查看自页面调入以来是否已在服务器端对其进行了修改。我该怎么做?

您的示例有些粗糙。如果只有100个线程,则最好一次下载全部100个线程。如果您要从10,000分中提取20分,那就另当别论了。
Dan Pichelman

@DanPichelman对不起,我有点不清楚。大概是10,000。
goodsquishy

为清楚起见,已编辑数字。
goodsquishy

这是http吗?如果是,为什么不仅基于url进行缓存?在网址中包含所有参数。如果是浏览器,请尝试利用浏览器缓存。如果是应用程序,请设置缓存过期时间。Android的Volley运作良好。
2015年

Answers:


7

看来你需要的是定义一个页面中的所有参数(比如包装pageNumberpageSizesortTypetotalCount,等),并使用该DataRequest对象为您的缓存机制的关键。从这一点开始,您可以使用许多选项来处理缓存:

  • 实现某种超时机制以刷新缓存(基于数据更改的频率)。
  • 有一个侦听器,它检查数据库更改并根据上述参数更新缓存。
  • 如果更改是通过相同的过程完成的,则每次更改时,您始终可以将缓存标记为过时,并在请求页面时选中此标志。

前两个可能涉及调度程序机制,该机制可在某个时间间隔或基于事件触发。如果您只有一个数据访问点,则最后一个可能会更简单。

最后,正如@DanPichelman所提到的,它很快就会成为一种过于复杂的算法,其价值超过了收益,因此请确保性能的提高证明了算法的复杂性是正确的。


3

我可能会这样处理:

  1. 将不同的顺序视为不同的序列。跟踪每个客户的资产(或一遍又一遍地发送),额外的簿记将不值得。
  2. 无论何时用户页面,都将立即从缓存中显示,同时将包含哈希或上次访问时间的GET发送到服务器。服务器仅在发生某些更改时才发回整页。
  3. 一次从服务器检索多个UI页面。例如,如果您的UI显示20个条目,则查询60。我需要对此进行测试,但是我期望最有效的返回值通常大于一页上显示的平均数据量。这也使UI在某些页面翻转时非常敏感。
  4. 接近边界时预取结果。这有助于保留高速缓存中的那些快速加载时间。

2

只是想一想-在您的服务器调用中,传递通常的参数以及代表当前缓存的先前查看的数据页的MD5哈希数组。

返回调用将包含新当前页面的所有常规数据,以及任何过时的先前查看页面的更新。您可以使用旧的哈希作为键。

我首先建议进行大量的性能和时序测试-您的客户端代码将比如果您简单地为每页数据访问服务器要复杂得多。确保额外的复杂性可以带来有意义的改进。


感谢您的回答。我当时在考虑哈希,但是不确定是否可以帮助重新排序(即,粒度不够,只能按页面而不是按结果操作)。我认为您的最后一段是一个很好的观点,并且开始认为任何可能的解决方案的复杂性都将超过性能收益。
goodsquishy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.