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

时间:2016-06-20 12:58:01

标签: amazon-web-services amazon-dynamodb nosql

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

问题1:

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

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

选项1:

将store_id / campaign_id放置在HASHKEY上,并将日期放在RANGEKEY上。

选项2:

与Cassandra结构一样,我可以使用store_id,store_id + date,campaign_id,campaign_id + date作为HASHKEY(无范围键)。

哪种选择适合最佳做法?

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

问题2:

我想计算特定商店的广告系列加载次数。我们将在用户访问商店时加载广告系列。例如,如果“alpha”用户访问商店,我们会展示广告系列,然后增加广告系列加载计数器。

我需要根据用户指定的时间段计算广告系列加载量。在Cassandra,我已经实现了以下结构。

campaign_id - 加载 - 10个(10个用户看过此广告系列)

campaign_id + 20160403 - 加载 - 4(4位用户在此数据中看过此广告系列)

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

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

示例:

campaign_load counter:

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

(一键写4键) - 我使用hector API连接Cassandra Node。

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

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

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

在我的应用程序中,我使用更多计数器。有关hwo的任何建议可以更新计数器吗?

1 个答案:

答案 0 :(得分:0)

问题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