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

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

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

【问题讨论】:

    标签: java cassandra pagination datastax query-builder


    【解决方案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 表?
    猜你喜欢
    • 2019-04-10
    • 2020-11-30
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2011-02-25
    • 2017-03-07
    相关资源
    最近更新 更多