3

我想在 DynamoDB 中实现类似于 Postgres的数字限制和基于偏移的分页。

我的 API 看起来像这样:http://foo.bar/user?offset=50&limit=20.

OutOfMemoryError在不考虑 DynamoDB使用ExclusiveStartKeyLastEvaluatedKey分页风险的情况下,在 Java 中执行此操作的最佳方法是什么?

编辑:

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

4

1 回答 1

2

在查看了 PaginatedList 在 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);

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

编辑:

看来我可以利用Commons-collections 中的 IteratorUtils来免费获得skipand collect

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

于 2019-09-20T11:25:53.860 回答