如何在api中实现用于分页的游标

时间:2013-08-19 13:11:59

标签: facebook api twitter pagination cursor

这类似于没有任何答案的this question。我已经阅读了关于如何使用twitterfacebookdisqus api以及this article关于disqus如何通常构建其游标的游标的所有内容,但我仍然无法使用似乎很好地理解了它们如何工作以及如何在我自己的项目中实现类似的解决方案。有人可以具体解释它们背后的不同技术和概念吗?

4 个答案:

答案 0 :(得分:33)

让我们首先了解为什么偏移分页对于带有示例的大型数据集失败。

客户端为结果数量和 偏移量 以及页面偏移量提供两个 限制 参数。 例如,当offset = 40,limit = 20时,我们可以告诉数据库返回接下来的20个项目,跳过前40个项目。

缺点:

  • 使用LIMIT OFFSET 无法很好地扩展 数据集即可。随着偏移的增加,你越往内越远 数据集,数据库仍然必须读取偏移+计数行 从磁盘,在丢弃偏移量并且仅返回计数之前 行。
  • 如果项目以高频率写入数据集,则为 页面窗口变得不可靠,可能会跳过或返回 重复结果

游标如何解决这个问题?

基于游标的分页通过返回指向数据集中特定项目的指针来工作。在后续请求中,服务器返回给定指针后的结果。

在这种情况下,我们将使用参数 next_cursor 以及 limit 作为客户端提供的参数。< / p>

假设我们想要从最近的用户分页到最老的用户。当客户端第一次请求时,假设我们通过查询选择第一页:

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

限制 等于限制加一,以获取比客户端指定的计数多一个结果。额外结果不会在结果集中返回,但我们使用值的ID作为 next_cursor

服务器的响应是:

{
   "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的行。这使我们可以利用列上的索引,而数据库不必读取我们已经看过的任何行

答案 1 :(得分:1)

通常,您应该将请求中的当前项目或页码作为参数传递。其他常见的参数是页面的批量大小。然后在服务器端后端选择并返回正确的数据集,例如SQL查询。

答案 2 :(得分:1)

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

游标–我们至少需要有一列具有唯一顺序值的列,才能实现基于游标的分页。这可能类似于Twitter的max_id参数或Facebook的after参数。

答案 3 :(得分:-5)

默认情况下,某些Graph API连接使用游标。您可以使用&#39;限制&#39; &#39;之前&#39;&#39;之后&#39;你的电话中的参数。如果您仍然不清楚,可以在此处发布您的代码,我可以用它来解释。