如何实现分页游标的API

问题描述 投票:31回答:4

这类似于给this question不具有任何答案。我读过所有关于如何使用游标与twitterfacebookdisqus API和也this article如何disqus普遍建立了自己的游标,但我似乎仍不能神交的他们是如何工作的概念,以及如何实现类似的解决方案在我自己的项目。有人能具体解释不同的技术和概念在他们身后?

facebook api twitter pagination cursor
4个回答
39
投票

让我们先了解为什么大型数据集的例子偏移分页失败。

客户端提供两个参数限制结果的数量和偏移量和页面偏移。例如,偏移量= 40,上限= 20,我们可以告诉数据库返回下一个20个项目,跳过第40。

缺点:

  • 使用限价抵消对于大型数据集不能很好地扩展。随着偏移增加得越远,你要走的数据集内,数据库中仍有读取多达偏移+丢弃偏移,只返回计数行之前从磁盘数行。
  • 如果项目被写入到数据集在高频率下,页面窗口变得不可靠,可能跳过或返回重复的结果。

游标会如何解决这个问题?

通过在数据集中的指针恢复到特定项目基于指针分页作品。在随后的请求,服务器返回给定的指针后的结果。

我们将使用参数next_cursor随着限制由客户端在这种情况下提供的参数。

假设我们想从最近的用户首次最古老的user.When客户端请求进行分页,假设我们通过查询选择的第一页:

SELECT * FROM users
WHERE team_id = %team_id
ORDER BY id DESC
LIMIT %limit

其中限制等于限制加一,以获取一个不是由客户指定的更个性化的结果。额外的结果不会在结果集中返回,但我们使用值作为next_cursor的ID。

从服务器的响应将是:

{
   "users": [...],
   "next_cursor": "1234",  # the user id of the extra result
}

然后,客户机将提供next_cursor作为光标在所述第二请求。

SELECT * FROM users
WHERE team_id = %team_id
AND id <= %cursor
ORDER BY id DESC
LIMIT %limit

有了这个,我们已经解决偏移分页基础的弊端:

  • 取而代之的是窗口被从头计算基于项目总数的每个请求,我们一直在一个特定的参考点后获取下一个数列。如果项目被写入到数据集在高频率下,光标在设定总体位置可能会改变,但分页窗口相应调整。
  • 这将很好地扩展为大型数据集。我们使用WHERE子句少取ID为值的行比前一页的最后一个ID。这让我们充分利用塔上的索引和数据库没有看我们已经看到任何行。

对于详细的解释,你可以参观从slack!这个奇妙的工程文章


2
投票

下面是关于分页的文章:paginating-real-time-data-cursor-based-pagination

游标 - 我们需要有唯一的顺序值至少一列来实现基于光标分页。这可能是类似的参数后,Twitter的max_id参数或Facebook的。


1
投票

一般来说,你应该通过当前项目或页面数的请求作为PARAM。其他常用的参数是页面的批量大小。然后在服务器端后端您选择并返回正确的数据集,与SQL查询的例子。


-6
投票

一些图形API的连接默认使用游标。你可以“后”在你的调用参数使用“限制”和“前” /。如果你还不清楚,你可以在这里发布您的代码,我可以用它解释。

© www.soinside.com 2019 - 2024. All rights reserved.