有没有一种简单的方法可以通过java从DynamoDB获取第N页的项目?

Wen*_* Du 8 java pagination amazon-dynamodb

我现在正在开发一个与Amazon DynamoDB相关联的Web应用程序,我想实现一个功能,我的用户可以直接到达第N页来查看项目信息,

有人告诉我,DynamoDB中的分页是基于最后一个键,而不是限制/偏移.它本身不支持偏移.DynamoDB扫描/查询分页

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

有更简单的方法吗?

Séb*_*ien 16

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

快速光标

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

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

数字指数

您还可以创建一个全局二级索引,您可以在其中对数据集进行分页.您可以为offset所有对象添加一个属性.您可以直接查询此全局索引以获取所需的页面.

显然,这仅在您不使用任何自定义过滤器时才有效...并且您必须在插入/删除/更新对象时保持此值.因此,只有拥有"仅附加"数据集时,此解决方案才有用

缓存光标

该解决方案建立在第一个解决方案之上.但是,您不是每次都可以获取密钥,而是可以缓存页面位置并将其重用于其他请求.像redis或memcached这样的缓存工具可以帮助您实现这一目标.

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

选择适合您需求的解决方案.我希望这能帮到您 :)

  • 使用“快速光标”方法,如果我有10,000个项目并想阅读最后的100个项目,我是否还需要首先扫描前9900个项目?这不符合成本效益。使用DynamoDB,即使您没有在响应中返回扫描的项目,您仍然需要为扫描的项目付费。 (3认同)