Dynamo DB中的自动递增计数器

时间:2016-07-04 23:44:46

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

我正在尝试为dynamo db中的散列键实现auto -increment计数器,并且我的代码对并发事务失败。任何帮助实现该功能将不胜感激。我是新的堆栈流可能无法正确指定它。任何实施都会有所帮助。

提前致谢。

3 个答案:

答案 0 :(得分:5)

您有两种选择,使用dynamo db原子计数器或在递增计数器时使用乐观锁定。

原子计数器的文档: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters

乐观锁定的文档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

答案 1 :(得分:0)

您还可以使用条件写入来检查当前存储的计数器值与您要写入的值,例如检查当前计数是否为新值N的N-1。

我更喜欢这种方法,因为它推动了将计数器递增到您的应用程序的逻辑,但最终检查正确的持久性是使用DynamoDB。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.ConditionalUpdate

答案 2 :(得分:0)

就像其他SOers正确指出的那样,您可以使用AtomicCountersConditionalUpdate。从2018年11月开始,您从DynamoDB获得了Transactions(免责声明:Havent亲自测试了事务,不确定是否适用于自动增量用例)

这是 AtomicCounter

上官方文档的引文
  

您可以使用UpdateItem操作来实现   原子计数器-递增的数字属性,   无条件地,而不会干扰其他写入请求。 (所有   写入请求将按照接收到的顺序进行应用。)   使用原子计数器,更新不是幂等的。其他   字,每次调用UpdateItem时数值都会递增。

     

您可以使用原子计数器来追踪访问者的数量   网站。在这种情况下,您的应用程序将增加一个数字   值,而不考虑其当前值。如果是UpdateItem操作   失败,应用程序可以简单地重试该操作。这个会   会有两次更新计数器的风险,但您可能可以忍受   网站访问者的数量被高估或低估了。

交易

  

引入了两个新的DynamoDB操作以进行处理   交易:

     

TransactWriteItems,一个包含写入集的批处理操作,带有   一个或多个PutItem,UpdateItem和DeleteItem操作。   TransactWriteItems可以选择检查先决条件   进行更新之前必须满足的条件。这些情况可能   涉及与写入集中相同或不同的项目。如果   不满足任何条件,交易将被拒绝。

     

TransactGetItems,一个批处理操作,其中包含一个读取集,其中包含一个   或更多GetItem操作。如果在以下时间发出了TransactGetItems请求   作为活动写事务的一部分的项,读   交易被取消。为了获得先前的承诺价值,您可以   可以使用标准阅读。