

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon Keyspaces（Apache Cassandra 兼容）的生存时间（TTL）功能让数据过期
<a name="TTL"></a>

Amazon Keyspaces（Apache Cassandra 兼容）生存时间 (TTL) 可自动让表中的数据过期，帮助您简化应用程序逻辑并优化存储价格。系统会根据您设置的“存活时间”值自动从表中删除不再需要的数据。

这样就能更容易地遵守基于业务、行业或监管要求的数据留存政策，这些政策规定了数据需要保留的时间或必须删除数据的时间。

例如，您可以在 AdTech 应用程序中使用 TTL 来计划特定广告的数据何时过期且客户不再可见。您还可以使用 TTL 自动停用旧数据，节省存储成本。

您可以为整个表设置默认 TTL 值，也可以为单个行和列覆盖该值。TTL 操作不会影响应用程序的性能。此外，用 TTL 标记为过期的行和列的数量不会影响表的可用性。

Amazon Keyspaces 会自动筛选出过期的数据，这样查询结果中就不会返回过期的数据，也不会在数据操作语言 (DML) 语句中使用。Amazon Keyspaces 通常会在过期日期后的 10 天内从存储空间中删除过期的数据。

在极少数情况下，如果底层存储分区持续存在活动，Amazon Keyspaces 可能无法在 10 天内删除数据，以保护可用性。对于这些情况，一旦分区上的流量减少，Amazon Keyspaces 会继续尝试删除过期数据。

从存储中永久删除数据后，就不再产生存储费用。

您可以使用控制台、Cassandra 查询语言（CQL）或 AWS CLI，设置、修改或禁用新表和现有表的默认 TTL 设置。

在配置了默认 TTL 的表上，您可以使用 CQL 语句来覆盖表的默认 TTL 设置，并将自定义 TTL 值应用于行和列。有关更多信息，请参阅[使用 `INSERT` 语句为新行设置自定义生存时间（TTL）值](TTL-how-to-insert-cql.md)和[使用 `UPDATE` 语句可编辑行和列的自定义生存时间（TTL）设置](TTL-how-to-update-cql.md)。

TTL 定价基于使用“生存时间”删除或更新的行的大小。TTL 操作的计量单位是 `TTL deletes`。每删除或更新一行数据，将消耗每 KB 数据一次 TTL 删除操作。

例如，要更新一个存储了 2.5 KB 数据的行并同时删除该行内的一个或多个列，将需要三次 TTL 删除操作。或者，要删除一个包含 3.5 KB 数据的完整行，将需要四次 TTL 删除操作。

每删除一行中的每 KB 数据，将消耗一次 TTL 删除操作。有关定价的更多信息，请参阅 [Amazon Keyspaces（Apache Cassandra 兼容）定价](https://aws.amazon.com/keyspaces/pricing)。

**Topics**
+ [Amazon Keyspaces 上线时间以及与服务的集成 AWS](#ttl-howitworks_integration)
+ [使用默认生存时间（TTL）设置创建新表](TTL-how-to-create-table.md)
+ [更新表的默认生存时间（TTL）值](TTL-how-to-update-default.md)
+ [创建启用自定义生存时间（TTL）设置的表](TTL-how-to-enable-custom-new.md)
+ [使用自定义生存时间（TTL）更新表](TTL-how-to-enable-custom-alter.md)
+ [使用 `INSERT` 语句为新行设置自定义生存时间（TTL）值](TTL-how-to-insert-cql.md)
+ [使用 `UPDATE` 语句可编辑行和列的自定义生存时间（TTL）设置](TTL-how-to-update-cql.md)

## Amazon Keyspaces 上线时间以及与服务的集成 AWS
<a name="ttl-howitworks_integration"></a>

Amazon 提供了以下 TTL 指标 CloudWatch ，用于实现持续监控。
+ `TTLDeletes` – 使用生存时间 (TTL) 删除或更新一行数据所消耗的单位。

有关如何监控 CloudWatch 指标的更多信息，请参阅[使用亚马逊监控亚马逊密钥空间 CloudWatch](monitoring-cloudwatch.md)。

使用时 CloudFormation，您可以在创建 Amazon Keyspaces 表时启用 TTL。有关更多信息，请参阅 [AWS CloudFormation 《用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html)。

# 使用默认生存时间（TTL）设置创建新表
<a name="TTL-how-to-create-table"></a>

在 Amazon Keyspaces 中，您可以在创建表时为表中的所有行设置默认 TTL 值。

表的默认 TTL 值为零，表示数据不会自动过期。如果表的默认 TTL 值大于零，则会为每行添加一个过期时间戳。

TTL 值以秒为单位设置，最大可配置值为 630,720,000 秒，相当于 20 年。

创建表后，可以使用 CQL DML 语句针对特定行或列覆盖表的默认 TTL 设置。有关更多信息，请参阅[使用 `INSERT` 语句为新行设置自定义生存时间（TTL）值](TTL-how-to-insert-cql.md)和[使用 `UPDATE` 语句可编辑行和列的自定义生存时间（TTL）设置](TTL-how-to-update-cql.md)。

当您在表上启用 TTL 时，Amazon Keyspaces 会开始为每行存储其他与 TTL 相关的元数据。此外，TTL 使用过期时间戳来跟踪行或列的过期时间。时间戳存储为行的元数据，并占该行的存储成本。

 TTL 功能启用后，无法为表禁用它。将表的 `default_time_to_live` 设置为 0 会禁用新数据的默认过期时间，但不会停用 TTL 功能，也不会将表恢复到原来的 Amazon Keyspaces 存储元数据或写入行为。

以下示例说明了如何创建带有默认 TTL 值的新表。

------
#### [ Console ]

**通过控制台使用生存时间默认值创建新表。**

1. [登录并在家中打开 Amazon Keyspaces 控制台。 AWS 管理控制台 https://console.aws.amazon.com/keyspaces/](https://console.aws.amazon.com/keyspaces/home)

1. 在导航窗格中，选择**表**，然后选择**创建表**。

1. 在**创建表**页面的**表详细信息**部分中，选择一个键空间并为新表提供一个名称。

1. 在**架构**部分，为您的表创建架构。

1. 在**表设置**部分，选择**自定义设置**。

1. 继续设置**生存时间 (TTL)**。

   在此步骤中，您为表选择默认 TTL 设置。

   对于**默认 TTL 周期**，输入到期时间并选择您输入的时间单位，例如秒、天或年。Amazon Keyspaces 将在几秒钟内存储值。

1. 选择**创建表**。系统将使用使用指定的默认 TTL 值创建您的表。

------
#### [ Cassandra Query Language (CQL) ]

**通过 CQL 使用默认 TTL 值创建新表**

1. 以下语句创建一个新表，默认 TTL 值设置为 3,024,000 秒（代表 35 天）。

   ```
   CREATE TABLE my_table (
                   userid uuid,
                   time timeuuid,
                   subject text,
                   body text,
                   user inet,
                   PRIMARY KEY (userid, time)
                   ) WITH default_time_to_live = 3024000;
   ```

1. 要确认新表的 TTL 设置，请使用 `cqlsh` `DESCRIBE` 语句，如以下示例所示。输出将该表的默认 TTL 设置显示为 `default_time_to_live`。

   ```
   DESC TABLE my_table;
   ```

   ```
   CREATE TABLE my_keyspace.my_table (
       userid uuid,
       time timeuuid,
       body text,
       subject text,
       user inet,
       PRIMARY KEY (userid, time)
   ) WITH CLUSTERING ORDER BY (time ASC)
       AND bloom_filter_fp_chance = 0.01
       AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
       AND comment = ''
       AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
       AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
       AND crc_check_chance = 1.0
       AND dclocal_read_repair_chance = 0.0
       AND default_time_to_live = 3024000
       AND gc_grace_seconds = 7776000
       AND max_index_interval = 2048
       AND memtable_flush_period_in_ms = 3600000
       AND min_index_interval = 128
       AND read_repair_chance = 0.0
       AND speculative_retry = '99PERCENTILE';
   ```

------
#### [ CLI ]

**使用默认 TTL 值创建新表 AWS CLI**

1. 您可以使用以下命令创建新表，默认 TTL 值设置为 1 年。

   ```
   aws keyspaces create-table --keyspace-name 'myKeyspace' --table-name 'myTable' \
               --schema-definition 'allColumns=[{name=id,type=int},{name=name,type=text},{name=date,type=timestamp}],partitionKeys=[{name=id}]' \
               --default-time-to-live '31536000'
   ```

1. 要确认表的 TTL 状态，您可以使用以下命令。

   ```
   aws keyspaces get-table --keyspace-name 'myKeyspace' --table-name 'myTable'
   ```

   命令的输出如以下示例所示

   ```
   {
       "keyspaceName": "myKeyspace",
       "tableName": "myTable",
       "resourceArn": "arn:aws:cassandra:us-east-1:111122223333:/keyspace/myKeyspace/table/myTable",
       "creationTimestamp": "2024-09-02T10:52:22.190000+00:00",
       "status": "ACTIVE",
       "schemaDefinition": {
           "allColumns": [
               {
                   "name": "id",
                   "type": "int"
               },
               {
                   "name": "date",
                   "type": "timestamp"
               },
               {
                   "name": "name",
                   "type": "text"
               }
           ],
           "partitionKeys": [
               {
                   "name": "id"
               }
           ],
           "clusteringKeys": [],
           "staticColumns": []
       },
       "capacitySpecification": {
           "throughputMode": "PAY_PER_REQUEST",
           "lastUpdateToPayPerRequestTimestamp": "2024-09-02T10:52:22.190000+00:00"
       },
       "encryptionSpecification": {
           "type": "AWS_OWNED_KMS_KEY"
       },
       "pointInTimeRecovery": {
           "status": "DISABLED"
       },
       "ttl": {
           "status": "ENABLED"
       },
       "defaultTimeToLive": 31536000,
       "comment": {
           "message": ""
       },
       "replicaSpecifications": []
   }
   ```

------

# 更新表的默认生存时间（TTL）值
<a name="TTL-how-to-update-default"></a>

您可以使用新的默认 TTL 值来更新现有表。TTL 值以秒为单位设置，最大可配置值为 630,720,000 秒，相当于 20 年。

当您在表上启用 TTL 时，Amazon Keyspaces 会开始为每行存储其他与 TTL 相关的元数据。此外，TTL 使用过期时间戳来跟踪行或列的过期时间。时间戳存储为行的元数据，并占该行的存储成本。

为表启用 TTL 后，可以使用 CQL DML 语句针对特定行或列覆盖表的默认 TTL 设置。有关更多信息，请参阅[使用 `INSERT` 语句为新行设置自定义生存时间（TTL）值](TTL-how-to-insert-cql.md)和[使用 `UPDATE` 语句可编辑行和列的自定义生存时间（TTL）设置](TTL-how-to-update-cql.md)。

 TTL 功能启用后，无法为表禁用它。将表的 `default_time_to_live` 设置为 0 会禁用新数据的默认过期时间，但不会停用 TTL 功能，也不会将表恢复到原来的 Amazon Keyspaces 存储元数据或写入行为。

按照以下步骤，使用控制台、CQL 或 AWS CLI更新现有表的默认生存时间设置。

------
#### [ Console ]

**使用控制台更新表的默认 TTL 值**

1. [登录并在家中打开 Amazon Keyspaces 控制台。 AWS 管理控制台 https://console.aws.amazon.com/keyspaces/](https://console.aws.amazon.com/keyspaces/home)

1. 选择要更新的表，然后选择**其他设置**选项卡。

1. 继续选择**生存时间 (TTL)**，然后选择**编辑**。

1. 对于**默认 TTL 周期**，输入到期时间并选择时间单位，例如秒、天或年。Amazon Keyspaces 将在几秒钟内存储值。这不会更改现有行的 TTL 值。

1. 定义 TTL 设置后，选择**保存更改**。

------
#### [ Cassandra Query Language (CQL) ]

**使用 CQL 更新表的默认 TTL 值**

1. 您可以使用 `ALTER TABLE` 编辑表的默认生存时间（TTL）设置。要将表的默认 TTL 设置更新为 2,592,000 秒（代表 30 天），可以使用以下语句。

   ```
   ALTER TABLE my_table WITH default_time_to_live = 2592000;
   ```

1. 要确认更新后的表的 TTL 设置，请使用的 `cqlsh` `DESCRIBE` 语句，如以下示例所示。输出将该表的默认 TTL 设置显示为 `default_time_to_live`。

   ```
   DESC TABLE my_table;
   ```

   语句的输出应类似于以下示例。

   ```
   CREATE TABLE my_keyspace.my_table (
       id int PRIMARY KEY,
       date timestamp,
       name text
   ) WITH bloom_filter_fp_chance = 0.01
       AND caching = {'class': 'com.amazonaws.cassandra.DefaultCaching'}
       AND comment = ''
       AND compaction = {'class': 'com.amazonaws.cassandra.DefaultCompaction'}
       AND compression = {'class': 'com.amazonaws.cassandra.DefaultCompression'}
       AND crc_check_chance = 1.0
       AND dclocal_read_repair_chance = 0.0
       AND default_time_to_live = 2592000
       AND gc_grace_seconds = 7776000
       AND max_index_interval = 2048
       AND memtable_flush_period_in_ms = 3600000
       AND min_index_interval = 128
       AND read_repair_chance = 0.0
       AND speculative_retry = '99PERCENTILE';
   ```

------
#### [ CLI ]

**使用更新表的默认 TTL 值 AWS CLI**

1. 可以使用 `update-table` 编辑表的默认 TTL 值。要将表的默认 TTL 设置更新为 2,592,000 秒（代表 30 天），可以使用以下语句。

   ```
   aws keyspaces update-table --keyspace-name 'myKeyspace' --table-name 'myTable' --default-time-to-live '2592000'
   ```

1. 要确认更新的默认 TTL 值，可以使用以下语句。

   ```
   aws keyspaces get-table --keyspace-name 'myKeyspace' --table-name 'myTable'
   ```

   语句输出应类似于以下示例。

   ```
   {
       "keyspaceName": "myKeyspace",
       "tableName": "myTable",
       "resourceArn": "arn:aws:cassandra:us-east-1:111122223333:/keyspace/myKeyspace/table/myTable",
       "creationTimestamp": "2024-09-02T10:52:22.190000+00:00",
       "status": "ACTIVE",
       "schemaDefinition": {
           "allColumns": [
               {
                   "name": "id",
                   "type": "int"
               },
               {
                   "name": "date",
                   "type": "timestamp"
               },
               {
                   "name": "name",
                   "type": "text"
               }
           ],
           "partitionKeys": [
               {
                   "name": "id"
               }
           ],
           "clusteringKeys": [],
           "staticColumns": []
       },
       "capacitySpecification": {
           "throughputMode": "PAY_PER_REQUEST",
           "lastUpdateToPayPerRequestTimestamp": "2024-09-02T10:52:22.190000+00:00"
       },
       "encryptionSpecification": {
           "type": "AWS_OWNED_KMS_KEY"
       },
       "pointInTimeRecovery": {
           "status": "DISABLED"
       },
       "ttl": {
           "status": "ENABLED"
       },
       "defaultTimeToLive": 2592000,
       "comment": {
           "message": ""
       },
       "replicaSpecifications": []
   }
   ```

------

# 创建启用自定义生存时间（TTL）设置的表
<a name="TTL-how-to-enable-custom-new"></a>

要在不对整个表启用 TTL 默认设置的情况下使用可应用于行和列的生存时间自定义设置创建新表，可以使用以下命令。

**注意**  
如果创建启用了 `ttl` 自定义设置的表，则以后将无法禁用该设置。

------
#### [ Cassandra Query Language (CQL) ]

**通过 CQL 使用自定义 TTL 设置创建新表**
+ 

  ```
  CREATE TABLE my_keyspace.my_table (id int primary key) WITH CUSTOM_PROPERTIES={'ttl':{'status': 'enabled'}};
  ```

------
#### [ CLI ]

**使用自定义 TTL 设置创建新表 AWS CLI**

1. 您可以使用以下命令创建启用 TTL 的新表。

   ```
   aws keyspaces create-table --keyspace-name 'myKeyspace' --table-name 'myTable' \
                                   --schema-definition 'allColumns=[{name=id,type=int},{name=name,type=text}, {name=date,type=timestamp}],partitionKeys=[{name=id}]' \
                                   --ttl 'status=ENABLED'
   ```

1. 要确认为表启用了 TTL，可以使用以下语句。

   ```
   aws keyspaces get-table --keyspace-name 'myKeyspace' --table-name 'myTable'
   ```

   语句输出应类似于以下示例。

   ```
   {
       "keyspaceName": "myKeyspace",
       "tableName": "myTable",
       "resourceArn": "arn:aws:cassandra:us-east-1:111122223333:/keyspace/myKeyspace/table/myTable",
       "creationTimestamp": "2024-09-02T10:52:22.190000+00:00",
       "status": "ACTIVE",
       "schemaDefinition": {
           "allColumns": [
            {
                   "name": "id",
                   "type": "int"
               },
               {
                   "name": "date",
                   "type": "timestamp"
               },
               {
                   "name": "name",
                   "type": "text"
               }
           ],
           "partitionKeys": [
               {
                   "name": "id"
               }
           ],
           "clusteringKeys": [],
           "staticColumns": []
       },
       "capacitySpecification": {
           "throughputMode": "PAY_PER_REQUEST",
           "lastUpdateToPayPerRequestTimestamp": "2024-09-02T11:18:55.796000+00:00"
       },
       "encryptionSpecification": {
           "type": "AWS_OWNED_KMS_KEY"
       },
       "pointInTimeRecovery": {
           "status": "DISABLED"
       },
       "ttl": {
           "status": "ENABLED"
       },
       "defaultTimeToLive": 0,
       "comment": {
           "message": ""
       },
       "replicaSpecifications": []
   }
   ```

------

# 使用自定义生存时间（TTL）更新表
<a name="TTL-how-to-enable-custom-alter"></a>

要在不为整个表设置 TTL 默认值的情况下为表启用生存时间自定义设置，以便 TTL 值可应用于各个行和列，可以使用以下命令。

**注意**  
为表启用 `ttl` 后便无法禁用该设置。

------
#### [ Cassandra Query Language (CQL) ]

**使用 CQL 为表启用自定义 TTL 设置**
+ 

  ```
  ALTER TABLE my_table WITH CUSTOM_PROPERTIES={'ttl':{'status': 'enabled'}};
  ```

------
#### [ CLI ]

**使用为表格启用自定义 TTL 设置 AWS CLI**

1. 可以使用以下命令来更新表的自定义 TTL 设置。

   ```
   aws keyspaces update-table --keyspace-name 'myKeyspace' --table-name 'myTable' --ttl 'status=ENABLED'
   ```

1. 要确认现已为表启用 TTL，可以使用以下语句。

   ```
   aws keyspaces get-table --keyspace-name 'myKeyspace' --table-name 'myTable'
   ```

   语句输出应类似于以下示例。

   ```
   {
       "keyspaceName": "myKeyspace",
       "tableName": "myTable",
       "resourceArn": "arn:aws:cassandra:us-east-1:111122223333:/keyspace/myKeyspace/table/myTable",
       "creationTimestamp": "2024-09-02T11:32:27.349000+00:00",
       "status": "ACTIVE",
       "schemaDefinition": {
           "allColumns": [
               {
                   "name": "id",
                   "type": "int"
               },
               {
                   "name": "date",
                   "type": "timestamp"
               },
               {
                   "name": "name",
                   "type": "text"
               }
           ],
           "partitionKeys": [
               {
                   "name": "id"
               }
           ],
           "clusteringKeys": [],
           "staticColumns": []
       },
       "capacitySpecification": {
           "throughputMode": "PAY_PER_REQUEST",
           "lastUpdateToPayPerRequestTimestamp": "2024-09-02T11:32:27.349000+00:00"
       },
       "encryptionSpecification": {
           "type": "AWS_OWNED_KMS_KEY"
       },
       "pointInTimeRecovery": {
           "status": "DISABLED"
       },
       "ttl": {
           "status": "ENABLED"
       },
       "defaultTimeToLive": 0,
       "comment": {
           "message": ""
       },
       "replicaSpecifications": []
   }
   ```

------

# 使用 `INSERT` 语句为新行设置自定义生存时间（TTL）值
<a name="TTL-how-to-insert-cql"></a>

**注意**  
在使用 `INSERT` 语句为行设置自定义 TTL 值之前，必须先在表上启用自定义 TTL。有关更多信息，请参阅 [使用自定义生存时间（TTL）更新表](TTL-how-to-enable-custom-alter.md)。

要通过为各行设置过期日期来覆盖表的默认 TTL 值，可以使用以下 `INSERT` 语句：
+ `INSERT` – 插入设置了 TTL 值的新数据行。

使用 `INSERT` 为新行设置 TTL 值优先于表的默认 TTL 设置。

以下 CQL 语句在表中插入一行数据，并将默认 TTL 设置更改为 259,200 秒（相当于 3 天）。

```
INSERT INTO my_table (userid, time, subject, body, user)
        VALUES (B79CB3BA-745E-5D9A-8903-4A02327A7E09, 96a29100-5e25-11ec-90d7-b5d91eceda0a, 'Message', 'Hello','205.212.123.123')
        USING TTL 259200;
```

要确认插入行的 TTL 设置，请使用以下语句。

```
SELECT TTL (subject) from my_table;
```

# 使用 `UPDATE` 语句可编辑行和列的自定义生存时间（TTL）设置
<a name="TTL-how-to-update-cql"></a>

**注意**  
必须先在表上启用 TTL，然后才能为行和列设置自定义 TTL 值。有关更多信息，请参阅 [使用自定义生存时间（TTL）更新表](TTL-how-to-enable-custom-alter.md)。

可以使用 `UPDATE` 语句，通过为各行设置过期日期来覆盖表的默认 TTL 值：
+ 行 - 可以使用自定义 TTL 值来更新现有数据行。
+ 列 - 可以使用自定义 TTL 值更新现有行中的部分列。

为行和列设置 TTL 值优先于表的默认 TTL 设置。

要将前面插入的 subject 列的 TTL 设置从 259,200 秒（3 天）改为 86,400 秒（1 天），请使用以下语句。

```
UPDATE my_table USING TTL 86400 set subject = 'Updated Message' WHERE userid = B79CB3BA-745E-5D9A-8903-4A02327A7E09 and time = 96a29100-5e25-11ec-90d7-b5d91eceda0a;
```

您可以运行一个简单的选择查询，查看到期时间之前更新的记录。

```
SELECT * from my_table;
```

该查询会显示以下输出。

```
userid                               | time                                 | body  | subject         | user
--------------------------------------+--------------------------------------+-------+-----------------+-----------------
b79cb3ba-745e-5d9a-8903-4a02327a7e09  | 96a29100-5e25-11ec-90d7-b5d91eceda0a | Hello | Updated Message | 205.212.123.123
50554d6e-29bb-11e5-b345-feff819cdc9f  | cf03fb21-59b5-11ec-b371-dff626ab9620 | Hello |         Message | 205.212.123.123
```

要确认过期已成功，请在配置的过期时间后再次运行相同的查询。

```
SELECT * from my_table;
```

在 subject 列过期后，该查询会显示以下输出。

```
userid                               | time                                 | body  | subject | user
--------------------------------------+--------------------------------------+-------+---------+-----------------
b79cb3ba-745e-5d9a-8903-4a02327a7e09  | 96a29100-5e25-11ec-90d7-b5d91eceda0a | Hello |    null | 205.212.123.123
50554d6e-29bb-11e5-b345-feff819cdc9f  | cf03fb21-59b5-11ec-b371-dff626ab9620 | Hello | Message | 205.212.123.123
```