当前位置: 首页 > 知识库问答 >
问题:

如何在api中实现分页游标

陆绪
2023-03-14

这类似于这个没有任何答案的问题。我已经阅读了所有关于如何在twitter、facebook和Disqs api中使用游标的内容,以及这篇关于Disqs通常如何构建游标的文章,但我似乎仍然无法理解它们是如何工作的,以及如何在我自己的项目中实现类似的解决方案。有人能具体解释他们背后的不同技术和概念吗?

共有3个答案

甄永年
2023-03-14

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

闻人宇定
2023-03-14

下面是一篇关于分页的文章:基于光标的实时数据分页

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

利俊迈
2023-03-14

让我们首先通过一个示例了解为什么偏移分页对于大型数据集失败。

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

缺点:

  • 对于大型数据集,使用限制偏移量并不能很好地扩展。随着偏移量的增加,您在数据集中走得越远,数据库仍必须读取磁盘中的偏移量count行,然后才能丢弃偏移量并仅返回count行
  • 如果项目以高频率写入数据集,页面窗口将变得不可靠,可能会跳过或返回重复的结果

光标如何解决这个问题?

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

在这种情况下,我们将使用参数next\u cursor和limit作为客户端提供的参数。

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

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
}

然后,客户端将在第二个请求中提供下一个\u游标作为游标。

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

通过这种方式,我们解决了基于偏移量分页的缺点:

  • 我们不是根据项目总数对每个请求从头开始计算窗口,而是始终在特定参考点之后获取下一个计数行。如果项目被高频写入数据集,则光标在集合中的整体位置可能会改变,但分页窗口会相应调整。
  • 这将很好地扩展大型数据集。我们使用WHERE子句来获取id值小于上一页最后一个id的行。这让我们可以利用列上的索引,数据库不必读取我们已经看到的任何行。

有关详细说明,您可以从slack访问这篇精彩的工程文章!

 类似资料:
  • 问题内容: 我是ReactJS的新手,正在其中创建一个简单的TODO应用程序。实际上,这是一个非常基本的应用程序,没有数据库连接,任务存储在数组中。我现在想添加分页功能,并添加了“编辑和删除”功能。如何实施?任何帮助将不胜感激。谢谢…!! 问题答案: 我最近在纯React JS中实现了分页。这是一个工作示例:http : //codepen.io/PiotrBerebecki/pen/pEYPbY

  • 如何在Struts 2中为客户端显示实现分页,并将Hibernate作为持久层。 以下是我迄今为止完成的代码: 有没有办法在没有标签的情况下实现这一点?

  • 问题内容: Spring MVC中是否有任何现成的,易于实现的标准分页组件/ tag-lib或代码示例可用于分页? 问题答案: 有关示例,请参见样本中的JPetstore,例如

  • 问题内容: 是否有任何可用于实现列表分页的库? 假设我有10行的空间,并且用户可以选择是否要按页面向前或向后滚动(因此+-10个项目)。这可能例如由来控制。 要构建一个类,以防止在没有足够的项目可显示时向后/向前滚动,以及自我保存用户当前在哪个页面上的状态,这可能是一项艰巨的工作。 那有什么事吗 问题答案: 我之前已经解决了。我做了一个静态的getPages方法,该方法将通用集合分解为页面列表(也

  • 问题内容: 我知道使用这种方法来实现分页是一种不好的做法,因为当数据变大时,这会消耗大量内存。解决此问题的一种方法是按字段使用自然顺序: 问题是-我是mongo的新手,不知道什么是最好的方式 问题答案: 您正在谈论的概念可以称为“转发分页”。这有一个很好的理由,与使用和修饰符不同,它不能用于“返回”上一页或实际上“跳”至特定页面。至少不需要花费很多精力来存储“可见的”或“发现的”页面,因此,如果您

  • 问题内容: 我不是在寻找Hibernate / JPA / JDBC实现,而是在寻求一种通用的设计模式。 谷歌搜索“分页”为我提供了大量信息,许多有趣的文章解释了如何在UI上实现分页以及各种或多或少都执行相同操作的实现。 简单的bean: 一个简单的DAO界面: 和hibernate实现 现在,我在考虑是否必须在所有接口中都包含相似的参数,那么这里确实有问题。我可以将请求包装在请求bean对象中,