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、campaign_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 Cognito 组来设置对 AW 资源(例如 Amazon DynamoDB 和 Amazon S3)的权限?