如何在 cassandra 中为 API 实现分页?

Posted

技术标签:

【中文标题】如何在 cassandra 中为 API 实现分页?【英文标题】:How to implement pagination in cassandra for API? 【发布时间】:2020-05-27 22:39:29 【问题描述】:

我想使用 QueryBuilder (datastax) 在 cassandra 中实现分页。例如 /api/5 将获取限制为 20 的第 5 页结果。据我所知,我们需要存储最后一页状态。是否可以直接访问特定页面。基本上,限制 x,偏移 y 的 cassandra 等效项是多少?

这里主要关注的是性能(基于时间)。

【问题讨论】:

【参考方案1】:

所有查询都由驱动程序分页,您已经正确了。

您可以在application.conf 或语句中使用以下参数定义页面大小。
datastax-java-driver.basic.request.page-size = 5000

ResultSet 返回的对象中,您可以调用getAvailableWithoutFetching 以了解您在此页面中有多少记录。记录存储在Iterable 中,当您到达页面末尾时,驱动程序将在后台为您获取下一页。驱动文档:https://docs.datastax.com/en/developer/java-driver/4.4/manual/core/paging/

您可能听说过 PagingState,这是一个参数,您可以存储并使用该参数在第二次调用中重新发送,使用完全相同的查询直接访问页面 X - 但 这不是您想要的.

要使用限制/偏移量,我只需迭代 ResultSet 中的记录,如下所示:

public Stream<Stock> findAllBySymbol(
      @NonNull String symbol,
      @NonNull Instant start,
      @NonNull Instant end,
      long offset,
      long limit) 
    BoundStatement bound = findBySymbol.bind(symbol, start, end);
    ResultSet rs = session.execute(bound);
    Stream<Row> stream = Stream.iterate(rs.one(), Objects::nonNull, row -> rs.one());
    return stream.skip(offset).limit(limit).map(rowMapper);
  

来源。您可能会注意到,在 repo 中,您也有响应式和异步的示例:https://github.com/datastax/cassandra-reactive-demo/blob/master/1_sync/src/main/java/com/datastax/demo/sync/repository/SyncStockRepository.java#L119

【讨论】:

谢谢。我关心的是响应时间。如果我访问第 n 行到 m 行,是否等同于迭代 m 行而不是 SQL 表?

以上是关于如何在 cassandra 中为 API 实现分页?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 的 Stargate 文档 API 的分页

cassandra高级操作之分页的java实现(有项目具体需求)

使用 Spring Data 中的 CassandraRepository 为 Cassandra 实现分页的正确方法

我应该在 cassandra.yaml 中为 listen_address 使用啥地址?

在 cassandra 中处理分页结果

使用 spring-boot-data 在 Cassandra 中进行分页