
# 如何使用TTL
GeminiDB兼容DynamoDB接口的TTL功能用于定时清理不再需要的数据行。您可以指定表中每一行的过期时间戳，GeminiDB兼容DynamoDB接口会在过期时间后的一段时间内自动将其删除。
#### 如何配置TTL
可以通过UpdateTimeToLive接口打开/关闭表级别TTL开关，并设置表级别TTL列名，该列值即为过期时间戳的数值。
```
// 打开指定表的TTL开关，指定某一列的值为TTL时间戳
UpdateTimeToLiveRequest request1 = new UpdateTimeToLiveRequest()
                .withTableName("$tableName")
                .withTimeToLiveSpecification(new TimeToLiveSpecification()
                        .withAttributeName("$ttlAttr")
                        .withEnabled(true)
                );
// 通过UpdateItem等接口可以更新TTL列值
UpdateItemRequest request2 = new UpdateItemRequest()
                .withTableName("$tableName")
                .withKey(keyMap)
                .withUpdateExpression("SET $ttlAttr = :$ttlVal")
                .withExpressionAttributeValues(valueMap);
// 关闭指定表的TTL开关
UpdateTimeToLiveRequest request3 = new UpdateTimeToLiveRequest()
                .withTableName("$tableName")
                .withTimeToLiveSpecification(new TimeToLiveSpecification()
                        .withEnabled(false)
                );
```
使用DescribeTimeToLive接口可以查询表级别的TTL配置情况，包括TTL开关是否打开和TTL列名。
```
// 查询指定表的TTL配置
DescribeTimeToLiveRequest request1 = new DescribeTimeToLiveRequest().withTableName("$tableName");
```
![](https://support.huaweicloud.com/dynamodbug-nosql/public_sys-resources/note_3.0-zh-cn.png)
- TTL列类型必须为Number(N)。
- TTL列值会被转换为GMT+0时区的Unix时间戳(以秒为单位)，与当前时间比较来判断是否过期。
- TTL以定时任务的方式在后台运行，因此实际被删除的时间点并非与设置的过期时间戳完全一致，具体偏移量与任务执行周期有关。在数据量较大或写入压力较高的场景下，删除延迟可能更长。
- 所有打开TTL开关的用户表都会在TTL后台任务中被扫描，因此如果您不再需要某张表的TTL功能，推荐您关闭TTL开关。
- 兼容Dynamo Streams。通过TTL删除的行，会在实际被删除的时间点插入到Dynamo Streams记录中。
 
