scalardb - 如何在 ScalarDB 上实现应用程序级分页
问题描述
这个问题部分是 Cassandra,部分是 ScalarDB。我正在使用 ScalarDB,它在Cassandra
. 图书馆似乎运作良好!不幸的是,ScalarDB 不支持分页,所以我必须在应用程序中实现它。
考虑这种情况,其中P
主键C
是集群键并且E
是分区内的其他数据
Partition => { P,C1,E1
P,C2,E1
P,C2,E2
P,C2,E3
P,C2,E4
P,C3,E1
...
P,Cm,En
}
在 ScalarDB 中,我可以指定键的开始和结束值,所以我想 ScalarDB 将只从指定的行获取数据。我也可以限制没有。获取的条目数。
https://scalar-labs.github.io/scalardb/javadoc/com/scalar/db/api/Scan.html
假设我想获取条目E3
和E4
来自P,C2
. 对于较小的值,我可以将开始和结束聚类键指定为 C2 并将 fetch limit 设置为 4 并忽略E1
and E2
。但是如果有数百条记录,那么这种方法将无法扩展。
例如说P,C1
有 10 条记录,P,C2
有 100 条记录,我想为每个查询实现 20 条记录的分页。然后要实现这一点,我必须查询 1 - 扫描 - 主键将是 P,集群开始将是 C1,集群结束将是 Cn,因为我不知道那里有多少条记录。
- 得到
P,C1
. 这将提供 10 条记录 - 得到
P,C2
. 这将给我 20 条记录。我将忽略最后 10 个并将P,C1
10 与P,C2
前 10 组合并返回结果。
我还必须维护查询的最后一个集群键是C2
,并且从中获取了 10 条记录。
查询 2(用于下一个分页请求) - 扫描 - 主键为 P,聚类开始为 C2,聚类结束为 Cn,因为我不知道那里有多少条记录。现在我将获取P,C2
并获取 20 个,忽略第一个 10(因为它们上次发送),获取剩余的 10 个,使用相同的 Scan 进行另一次获取并从中获取前 10 个。
这是应该怎么做还是有更好的方法?我对上述实现的担忧是,每次我都必须获取大量记录并转储它们。例如,假设我想从那里获取记录 70-90,P,C2
我仍然会查询到记录 60 并转储结果!
解决方案
主键和集群键组成一个主键,因此您上面的示例看起来不正确。让我们假设以下数据结构。
P, C1, ...
P, C2, ...
P, C3, ...
...
无论如何,我认为其中一种方法可能如下。假设页面大小为 2。
- 以起始 (P, C1) 包括在内、升序和限制 2 进行扫描。结果存储在 R1 中
- 获取 R1 -> (P, C2) 的最后一条记录。
- 以不包括上一条记录 (P, C2) 开始扫描,以限制 2 递增。 ...
推荐阅读
- computer-vision - Incremental Learning in Yolo or in general
- java - 如何使用 Fake appupdatemanager 进行测试?
- java - 迭代地更改 Kafka Stream SessionWindows 的持续时间
- swift - Swift 5 中 UNUserNotificationCenter .requestAuthorization 的单元测试
- c# - 递增 LinkedList 的前“n”个整数
使用 Linq - php - 在 laravel 中使用队列的电子邮件之间的延迟
- r - R中的决策树图工具
- python - MongoDB 分组
- python - Pandas:过滤数据框中列中每个唯一单元格值的日期字段
- swiftui - SwiftUI 中 Stepper 的奇怪行为