

# DynamoDB 读取和写入
<a name="ddb-reads-writes"></a>

DynamoDB 读取和写入是指从表中检索数据（读取）以及在表中插入、更新或删除数据（写入）的操作。使用 DynamoDB 时，务必了解读取和写入的概念，因为它们会直接影响应用程序的性能和成本。

本主题详细介绍了适用于 DynamoDB 的不同类型的读取一致性。本主题还描述了您可能执行的不同读取和写入操作的单位消耗。

**Topics**
+ [DynamoDB 读取一致性](HowItWorks.ReadConsistency.md)
+ [DynamoDB 读取和写入操作](read-write-operations.md)

# DynamoDB 读取一致性
<a name="HowItWorks.ReadConsistency"></a>

Amazon DynamoDB 从表、本地二级索引（LSI）、全局二级索引（GSI）和流中读取数据。有关更多信息，请参阅 [Amazon DynamoDB 的核心组件](HowItWorks.CoreComponents.md)。表和 LSI 都提供两个读取一致性选项：*最终一致*读取（原定设置）和*强一致性*读取。来自 GSI 和流的所有读取是最终一致的。

 当您的应用程序向 DynamoDB 表写入数据并收到 HTTP 200 响应（OK）时，这意味着写入已成功完成并且已持久保持。DynamoDB 提供*读取已提交*隔离，并确保读取操作始终为项目返回提交的值。读取从不会显示在写入过程中最终未取得成功的项目。读取已提交隔离无法防止在读取操作后立即修改项目。

## 最终一致性读取
<a name="HowItWorks.ReadConsistency.Eventual"></a>

最终一致性是所有读取操作的原定设置读取一致性模型。当对 DynamoDB 表或索引发出最终一致读取时，响应可能不会反映最近完成的写入操作的结果。如果您在短时间后重复执行读取请求，响应最终将返回最新的项目。表、本地二级索引和全局二级索引都支持最终一致读取。另请注意，来自 DynamoDB 流的所有读取也是最终一致的。

 最终一致读取的成本是强一致性读取的一半。有关更多信息，请参阅 [Amazon DynamoDB 定价](https://aws.amazon.com/dynamodb/pricing/)。

## 强一致性读取
<a name="HowItWorks.ReadConsistency.Strongly"></a>

读取操作（例如 `GetItem`、`Query` 和 `Scan`）提供了一个可选 `ConsistentRead` 参数。如果您将 `ConsistentRead` 设置为 true，DynamoDB 会返回具有最新数据的响应，从而反映来自之前所有已成功的写入操作的更新。只有表和本地辅助索引才支持强一致性读取。不支持从全局二级索引或 DynamoDB 流进行强一致性读取。

## 全局表读取一致性
<a name="HowItWorks.ReadConsistency.Global"></a>

DynamoDB 还支持使用[全局表](GlobalTables.md)进行多活动和多区域复制。一个全局表由不同 AWS 区域中的多个副本表组成。对任何副本表中的任何项目所做的任何更改都将复制到同一全局表中的所有其他副本，时间通常在一秒钟内，并且最终一致。有关更多信息，请参阅 [一致性模式](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes)。

# DynamoDB 读取和写入操作
<a name="read-write-operations"></a>

DynamoDB 读取操作允许您通过指定分区键值和排序键值（可选），从表中检索一个或多个项目。使用 DynamoDB 写入操作，可以在表中插入、更新或删除项目。本主题说明了这两个操作的容量单位消耗。

**Topics**
+ [读取操作的容量单位消耗](#read-operation-consumption)
+ [写入操作的容量单位消耗](#write-operation-consumption)

## 读取操作的容量单位消耗
<a name="read-operation-consumption"></a>

DynamoDB 读取请求可以是强一致性、最终一致性或事务性的。
+ 一个不超过 4 KB 的项目的*强一致性*读取请求需要一个读取单位。
+ 一个不超过 4 KB 的项目的*最终一致性*读取请求需要半个读取单位。
+ 一个不超过 4 KB 的项目的*事务性*读取请求需要两个读取单位。

要了解有关 DynamoDB 读取一致性模型的更多信息，请参阅 [DynamoDB 读取一致性](HowItWorks.ReadConsistency.md)。

对于读取操作，项目大小会向上取整为 4KB 的倍数。例如，读取一个 3500 字节的项目将使用的吞吐量与读取一个 4KB 项目相同。

如果您需要读取大于 4 KB 的项目，DynamoDB 需要额外的读取单位。所需读取单位的总数取决于项目大小以及您需要的是最终一致性读取还是强一致性读取。例如，如果您的项目大小为 8 KB，则需要 2 个读取单位才能维持一次强一致性读取。如果您选择最终一致性读取，则需要 1 个读取单位；或者对于事务性读取请求，需要 4 个读取单位。

下面的列表介绍 DynamoDB 读取操作如何消耗读取单位：
+ [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)：从表中读取单个项目。要确定 `GetItem` 将消耗的读取单位的数量，请使用项目大小并将其向上取整到下一个 4 KB 界限值。如果您指定了强一致性读取，则这是所需的容量单位数。对于最终一致性读取（默认设置），请将此数字除以 2。

  例如，如果您读取一个 3.5 KB 的项目，DynamoDB 会将项目大小向上取整到 4KB。如果您读取一个 10 KB 的项目，DynamoDB 会将项目大小向上取整到 12 KB。
+ [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)：从一个或多个表中读取最多 100 个项目。DynamoDB 将批处理中的每个项目作为单独的 `GetItem` 请求。DynamoDB 首先将每个项目的大小向上取整到下一个 4 KB 界限值，然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如，如果 `BatchGetItem` 读取两个大小分别为 1.5 KB 和 6.5 KB 的项目，则 DynamoDB 将大小计算为 12 KB（4 KB \$1 8 KB）。DynamoDB 不会将大小计算为 8 KB（1.5 KB \$1 6.5 KB）。
+ [Query](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)：读取具有相同分区键值的多个项目。返回的所有项目将视为一个读取操作，DynamoDB 会计算所有项目的总大小。然后，DynamoDB 将结果向上取整到下一个 4 KB 界限值。例如，假设查询返回 10 个项目，其组合大小为 40.8 KB。DynamoDB 将操作的项目大小舍入为 44KB。如果查询返回了 1500 个项目，每个项目大小为 64 个字节，则累计大小为 96 KB。
+ [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)：读取表中的所有项。DynamoDB 所考量的是评估所得的项目大小，而不是扫描返回项目的大小。有关 Scan 操作的更多信息，请参阅[在 DynamoDB 中扫描表](Scan.md)。

**重要**  
如果您对某个*不存在的项目*执行读取操作，DynamoDB 仍将消耗读取吞吐量，如上所述。对于 `Query`/`Scan` 操作，即使不存在数据，仍会根据读取一致性以及为处理请求而搜索的分区数量，向您收取额外读取吞吐量的费用。

对于返回项目的任意操作，您可以请求检索属性的子集。不过，这样做对项目大小计算没有影响。另外，`Query` 和 `Scan` 返回的是项目数而不是属性值。获取项目计数将使用相同数量的读取单位，并且需要执行相同的项目大小计算。这是因为 DynamoDB 必须读取每个项目才能增加计数。

## 写入操作的容量单位消耗
<a name="write-operation-consumption"></a>

一个写入单位表示对大小最多为 1 KB 的项目执行一次写入。如果您需要写入大于 1 KB 的项目，DynamoDB 需要消耗额外的写入单位。事务性写入请求需要 2 个写入单位，才能对大小多达 1 KB 的项目执行一次写入。所需的写入请求单位的总数取决于项目大小。例如，如果您的项目大小为 2 KB，您需要 2 个写入单位才能维持一个读取请求；而对于事务性写入请求，则需要 4 个写入单位。

对于写入操作，项目大小会向上取整为 1 KB 的倍数。例如，写入一个 500 字节的项目使用的吞吐量与写入一个 1 KB 项目相同。

下面的列表介绍 DynamoDB 写入操作如何消耗写入单位：
+ [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)：将单个项目写入表中。如果该表中存在具有相同主键的项目，此操作会替换该项目。在计算预置的吞吐量占用时，起作用的项目是二者中较大的那个。
+ [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)：修改表中的单个项目。DynamoDB 将考虑项目在更新前后显示的大小。消耗的预置吞吐量反映这些项目大小中较大的数据。即使您更新项目属性的子集，`UpdateItem` 仍会消耗全部的预置吞吐量（“之前”和“之后”项目大小中的较大者）。
+ [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)：从表中移除单个项目。预置吞吐量占用情况取决于已删除的项目大小。
+ [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)：向一个或多个表写入最多 25 个项目。DynamoDB 将批处理中的每个项目作为单独的 `PutItem` 或者 `DeleteItem` 请求（不支持更新）。DynamoDB 首先将每个项目的大小向上取整到下一个 1 KB 界限值，然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如，如果 `BatchWriteItem` 读取两个大小分别为 500 字节和 3.5 KB 的项目，DynamoDB 将大小计算为 5 KB（1 KB \$1 4 KB）。DynamoDB 不会将大小计算为 4 KB（500 字节 \$1 3.5 KB）。

适用于`PutItem`、`UpdateItem`, 和 `DeleteItem` 操作时，DynamoDB 会将项目大小四舍五入到下一个 1 KB。例如，如果放入或删除 1.6 KB 的项目，则 DynamoDB 会将项目大小舍入为 2 KB。

`PutItem`、`UpdateItem` 和 `DeleteItem` 操作允许*有条件写入*，其中指定一个表达式的求值结果必须为 true，以便成功执行操作。如果该表达式计算为 false，DynamoDB 仍会消耗表的写入容量单位。消耗的写入容量单位数量将取决于项目的大小。此项目可以是表中的现有项目，也可以是您试图创建或更新的新项目。例如，假设一个现有项目为 300 KB。您正在尝试创建或更新的新项目为 310 KB。新项目消耗的写入容量单位将为 310 KB。