java - 如何在 cassandra 中为 API 实现分页?
问题描述
我想使用 QueryBuilder (datastax) 在 cassandra 中实现分页。例如 /api/5 将获取限制为 20 的第 5 页结果。据我所知,我们需要存储最后一页的状态。是否可以直接访问特定页面。基本上,限制 x,偏移 y 的 cassandra 等效项是多少?
这里主要关注的是性能(基于时间)。
解决方案
所有查询都由驱动程序分页,您已经正确。
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/您可能听说过
PagingState
which 是一个参数,您可以存储并使用它在第二次调用中重新发送,使用完全相同的查询直接访问页面 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
推荐阅读
- markdown - Markdown 方程未正确渲染
- apache-spark - 在 SparkSQL 中对数据集使用限制后应用过滤器时出现奇怪的结果
- kubernetes - hazelcast helm 模板,我如何传递我的 hazelcast.xml?
- api-platform.com - 设置集合的最大行数
- java - 如何在 IntelliJ 中配置 Kotlin?
- powershell - 通过appcmd检查iis模块是否存在
- angular - 如何创建 xOR Protractor ExpectedCondition 打字稿以等待元素通过(如果不相等)
- elasticsearch - 弹性如何定义给定另一个字段值的映射
- kubernetes - Kubernetes OIDC:组被忽略?
- scala - 在宏扩展访问特定符号的 typeSignature 时确认编译失败