【问题标题】:Numeric limit & offset based pagination in DynamoDB (Java)DynamoDB(Java)中基于数字限制和偏移的分页
【发布时间】:2019-09-20 11:25:53
【问题描述】:

我想在 DynamoDB similar to Postgres 中实现基于数值限制和偏移量的分页。

我的 API 如下所示:http://foo.bar/user?offset=50&limit=20

考虑到 DynamoDB uses ExclusiveStartKey and LastEvaluatedKey to paginate,在不冒险 OutOfMemoryError 的情况下,在 Java 中执行此操作的最佳方法是什么?

编辑:

让我们假设基于偏移的分页是一个硬性要求,我不知道“先前”页面。我的 API 合约有 offsetlimit 查询参数,如上所述。我不是在寻找“不要做基于偏移的分页”的答案。

【问题讨论】:

  • 20 条记录的基于偏移的分页(0、20、40、60. ...)搜索前一页上的最后一个键 + 21 条记录。后者可以快得多。 (只是避免使用后一种智能分页技术)
  • 谢谢@joop-eggen,但让我们假设基于偏移的分页在这里是一个硬性要求(我将添加一个编辑来澄清)。
  • 还有@JoopEggen,假设我不知道前一页,我不保持那个状态
  • (这确实是一种克服缓慢的数据库偏移访问的技术,需要保持和处理数据。不是代码设计中的东西。)
  • 啊,我明白你现在的意思了@JoopEggen,我可以有一个单独的“跳转表”来保存每个“桶”的开始键。现在,如果我需要深入页面,我可以跳转到最近的“桶”,而不必从头开始遍历。但这需要我在更新源表时以某种方式维护这个跳转表。这是一个有趣的想法。我想知道是否有一个库/模式可以帮助实现这一点。

标签: java amazon-dynamodb dynamodb-queries aws-java-sdk-dynamodb


【解决方案1】:

查看how PaginatedList work in the sdk后,似乎最有效的方法是在配置中使用ITERATION_ONLY分页加载策略,并执行以下操作:

DynamoDBMapperConfig config = new DynamoDBMapperConfig.Builder()
                       .withPaginationLoadingStrategy(ITERATION_ONLY)
                       .build();
PaginatedQueryList<MyUser> users = dynamoDBMapper.query(MyUser.class, myQueryExpression, config);
// This iterator will fetch 1MB worth of data 'on-demand'
Iterator<MyUser> userIterator = users.iterator();
skip(iterator, offset);
List<MyUser> aPageOfUser = collect(iterator, limit);

当然,我会承担在那里实现我自己的skipcollect 方法的成本。有没有更好/更简洁的方法来做到这一点?

编辑:

看来我可以利用IteratorUtils from commons-collections免费获得skipcollect

Iterator<MyUser> userIterator = IteratorUtils.boundedIterator(users.iterator(), offset, limit);
List<MyUser> aPageOfUser = IteratorUtils.toList(userIterator);

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多