DynamoDB 具有许多不同 的功能。一个经常被忽视的有用功能是使用原子计数器的能力。让我们看看为什么我们可能想要使用原子计数器,以及如何使用Python3和AWS SDK for Python (boto3)来实现原子写入。原子计数器在您想要持续增加或减少值的许多情况下都很有用。例如,您可能想要计算网站访问量或从某个数字倒数以确定比赛获胜者。但不要相信我的话,让我们考虑一个潜在的场景。假设我们有一个名为“siteVisits”的 DynamoDB 表,它有一个简单的主键和一个分区键属性“siteUrl”。我们还假设此表中的项目具有“visits”属性。最后,假设每当我们决定跟踪另一个网站的访问时,我们都会向表中添加新项目。因此,刚刚添加到表中的项目如下所示:
{ “siteUrl”:“https://www.linuxacademy.com/”, “访问”:“0” }
现在,假设我们在数据库中的所有网站页面上都放置了一些 JavaScript,并且此 JavaScript 调用我们创建的 API 来计算访问次数。我们如何编写 API 的后端以一致地记录新的访问次数?我们可以使用 DynamoDB 读取操作来查看之前的“访问次数”,然后使用一些代码添加额外的访问次数,然后再使用 DynamoDB 写入操作来写入新的访问次数。但是,如果在这两个操作之间我们又获得了一次访问次数怎么办?我们最终可能会在系统中少报访问次数,因为新的访问次数尚未写入。此外,如果写入操作停滞或失败,然后重新尝试,该怎么办?我们可能会冒着用上一次读取表时较旧的访问次数覆盖较新的访问次数的风险。那么解决这个问题的更好方法是什么呢?好吧,使用 DynamoDB 原子写入,您可以完全避免许多这些问题。您可以使用单个写入操作来增加“访问次数”值,而不是使用多个操作进行读取和写入。重要的是,这只能在“visits”属性具有数字类型时才能完成。下面的代码是我们每次记录访问 https://www.flinuxacademy.com/ 等网站时可以运行的示例。如果此代码失败并尝试在稍后再次运行,它将执行其应执行的操作 - 将访问次数增加一。
导入 boto3 dynamodb = boto3.client('dynamodb') response = dynamodb.update_item( TableName='siteVisits', Key={ 'siteUrl':{'S': "https://www.linuxacademy.com/"} }, UpdateExpression='SET visits = visits + :inc', ExpressionAttributeValues={ ':inc': {'N': '1'} }, ReturnValues="UPDATED_NEW" )打印("UPDATING ITEM")打印(响应)
每当上述代码运行 `visits` 属性时,它都会从当前值增加一。由于写入操作是按顺序处理的,因此永远不会存在这些操作相互覆盖或冲突的风险。此外,如果一个或多个 `update_item` 操作失败或中断,这不会对表的准确性造成超过单个失败增量的负面影响。这意味着您可以重试失败的操作,并在您这样做的同时继续允许其他增量操作继续。你还在等什么?自己尝试一下吧!
请先 登录后发表评论 ~