如何在 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 实现分页的正确方法