如何在Cassandra中实现API分页?

问题描述 投票:0回答:1

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

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

java cassandra pagination datastax query-builder
1个回答
0
投票

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

  • 您可以在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);
  }

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

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