Amazon dynamoDB 计数器更新和获取项目

Posted

技术标签:

【中文标题】Amazon dynamoDB 计数器更新和获取项目【英文标题】:Amazon dynamoDB Counters Update and get items 【发布时间】:2016-10-21 18:01:06 【问题描述】:

目前我正在将数据从 Cassandra 数据库移动到 amazon dynamoDB。当我了解 dynamoDB 实现的概念时,我对 dynamoDB 中的计数器更新有一些疑问。

问题 1:

在 Cassandra 中,我们通常使用 store_id、store_id+date、campaign_id、campaign_id+date 组合来更新计数器。

在 amazon dynamoDB 中,我们有 HASHKEY 和 RANGEKEY。我们只能使用 HASHKEY 或 HASHKEY 和 RANGEKEY。在这里我有两个选择。

选项 1:

将 store_id/campaign_id 放在 HASHKEY 上,将 date 放在 RANGEKEY 上。

选项 2:

和 Cassandra 结构一样,我可以使用 store_id、store_id+date、campaign_id、campaign_id+date 作为 HASHKEY(无 Range 键)。

哪个选项适合最佳实践?

当我们从 dynamoDB 读取值时,我需要 store_id 和 campaign_id 的总计数器值以及用户给出的范围。

问题 2:

我想计算特定商店的广告系列加载次数。当用户访问商店时,我们将加载广告系列。例如,如果“alpha”用户访问商店并且我们展示了广告系列,则增加广告系列负载计数器。

我需要根据用户给定的时间段计算广告系列负载。在 Cassandra 中,我实现了以下结构。

campaign_id - 加载次数 - 10(10 个用户看过这个活动)

campaign_id + 20160403 - 加载次数 - 4(4 个用户在此数据上看到了此活动)

如何在 Amazon dynamoDB 中实现相同的概念。

我注意到使用 dynamoDB 我们不能使用批量更新来更新多个项目(键)中的属性(计数器)。在这种情况下,我们将拥有比 Cassandra 更多的写入次数。

例子:

campaign_load 计数器:

使用 hector api,我们可以使用以下组合一次更新campaign_load 计数器。 store_id、store_id + datekey、c​​ampaign_id、campaign_id + datekey。

(4 个键,一次写入)- 我正在使用 hector API 连接 Cassandra 节点。

但在 amazon dynamoDB 中,我们需要进行 4 次写入。项目中的每个属性都会单独更新。 (4 个键,4 次写入)

Writebatch 概念在这里没有用。因为它将覆盖现有项目而不更新计数器。

如果计数器增加,写入次数也会增加。

在我的应用程序中,我使用了更多计数器。有什么建议可以更新计数器吗?

【问题讨论】:

其实问题2不清楚。如果您能提供实际需求而不是您的理解和一些部分解决方案,那就清楚了。 感谢您的回答。我已经编辑了问题 2。希望您理解这个概念 更新了答案2。 【参考方案1】:

问题 1:- 这取决于您的查询模式。如果 store_id/campaign_id 可以为主键提供唯一组合,则选项 1 应该是首选选项。此外,应用程序可以仅使用 store_id/campaign_id 查询数据库。我不确定应用程序是否在所有用例中都具有所有四个字段的值。

请注意,如果您没有 HASH 键,您可能需要扫描整个数据库,这在 Dynamo DB 中是一项代价高昂的操作。考虑到这一点,如果 store_id/campaign_id 可以提供唯一值,则选项 1 应该是首选。

哈希键+范围键必须唯一。

问题 2:- 假设您使用选项 1,您可以通过两种方式更新计数器: 1) 仅通过哈希键,即商店 ID 和活动 ID - 项目更新数等于商店 ID 和活动 ID 组合存在的项目数 2)通过哈希键+范围键组合-仅更新一项

计数器属性值可以在每个项目上增加 1 或 n。

在 DynamoDB 中,一项等于数据库中的一条记录。

查看 Dynamodb 中可用的原子计数器选项。 DynamoDB Atomic Counters Link

【讨论】:

根据您的要求,我已经编辑了问题。希望你能理解问题2 问题 2:这意味着您建议我们需要向 dynamoDB 发出 4 次更新请求(仅哈希键,哈希键 + 活动 ID 和商店 ID 的范围键组合)对吗?

以上是关于Amazon dynamoDB 计数器更新和获取项目的主要内容,如果未能解决你的问题,请参考以下文章

查询 Amazon DynamoDB 以获取特定结果

如何在 Amazon DynamoDB 中保存实时和历史车辆位置数据

如何将Amazon SQS与Dynamodb集成

数组类型中的图QL和DynamoDb更新项

是否可以使用 Amazon Cognito 组来设置对 AW 资源(例如 Amazon DynamoDB 和 Amazon S3)的权限?

DynamoDB + Quarkus - 奇数类型转换