【问题标题】:Is there a easy way to get Nth page of items from DynamoDB by java?有没有一种简单的方法可以通过 java 从 DynamoDB 中获取第 N 页项目?
【发布时间】:2017-06-25 19:58:21
【问题描述】:

我现在正在开发一个与 Amazon DynamoDB 相关的网络应用程序, 我想实现一个我的用户可以直接进入第N页查看商品信息的功能,

有人告诉我,DynamoDB 中的分页是基于最后一个键,而不是限制/偏移量。它本身不支持偏移量。DynamoDB Scan / Query Pagination

这是否意味着:如果我想进入第 10 页的项目,那么我必须先查询前面的 9 页?(这似乎不是一个好的解决方案)

有更简单的方法吗?

【问题讨论】:

标签: java pagination amazon-dynamodb


【解决方案1】:

你是对的。 DynamoDB 不支持数字偏移。分页的唯一方法是在发出请求时使用LastEvaluatedKey 参数。您仍然有一些不错的选择来使用数字实现分页。

快速光标

您可以通过丢弃完整结果并仅获取键来进行快速分页请求。每个请求限制为 1MB。这代表了大量的密钥!使用它,您可以将光标移动到所需位置并开始阅读完整的对象。

此解决方案适用于小型/中型数据集。您将在大型数据集上遇到性能和成本问题。

数字索引

您还可以创建一个全局二级索引,用于对数据集进行分页。例如,您可以为所有对象添加 offset 属性。可以直接查询这个全局索引,得到想要的页面。

显然,这仅在您不使用任何自定义过滤器时才有效...并且您必须在插入/删除/更新对象时保持此值。所以这个解决方案只有在你有一个 'append only' 数据集

时才有效

缓存光标

此解决方案基于第一个解决方案。但是,您可以缓存页面位置并将它们重用于其他请求,而不是每次都获取键。 redis 或 memcached 等缓存工具可以帮助您实现这一目标。

  1. 您检查缓存以查看是否已计算页面
  2. 如果没有,您扫描数据集仅获取密钥。然后将每个页面的起始 Key 存储在缓存中。
  3. 您请求所需页面以获取完整对象

选择适合您需求的解决方案。我希望这会对你有所帮助:)

【讨论】:

  • 使用Fast Cursor方法,如果我有10000条,想读取最后100条,是否还需要先扫描前9900条?这不符合成本效益。使用 DynamoDB,即使您没有在响应中返回扫描的项目,您仍然需要为扫描的项目付费。
  • “缓存游标”的另一种实现是通过将数据发送给调用者(通常是先混淆)并要求他们在后续调用中将数据发回,从而将状态推送回调用者。跨度>
  • 或者,将您的 DynamoDB 数据流式传输到 S3,配置外部 Glue 表并使用 Athena 查询您的数据。
  • 快速光标方法实际上并不可行。投影和过滤表达式仅在检索到所有数据后发生,因此 1MB 限制适用于分区中的所有数据,而不仅仅是您要查询的属性。
  • 我已经很长时间没有使用 dynamodb 了,所以我的回答可能不再有效。但如果我没记错的话,为了能够保持在 1MB 的限制,您需要创建一个全局二级索引,其中只包含您要过滤的内容。
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 2011-05-31
  • 2017-07-05
  • 2011-03-02
  • 2011-06-03
  • 2021-10-30
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多