首页 > 解决方案 > 如何在 cassandra 中为 API 实现分页?

问题描述

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

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

标签: javacassandrapaginationdatastaxquery-builder

解决方案


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

  • application.conf您可以在语句中或语句中使用以下参数定义页面的大小。
datastax-java-driver.basic.request.page-size = 5000
  • ResultSet返回的对象中,您可以调用getAvailableWithoutFetching以了解您在此页面中有多少记录。记录存储在 a 中Iterable,当您到达页面末尾时,驱动程序将在后台为您获取下一页。驱动程序文档:https ://docs.datastax.com/en/developer/java-driver/4.4/manual/core/paging/

  • 您可能听说过PagingStatewhich 是一个参数,您可以存储并使用它在第二次调用中重新发送,使用完全相同的查询直接访问页面 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


推荐阅读