Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

生存时间:工作原理

当在表中启用 生存时间 时,后台作业检查项目的 TTL 属性,了解其是否已过期。

TTL 将纪元时间格式的当前时间与项目 生存时间 属性中存储的时间进行比较。如果属性中存储的纪元时间值小于当前时间,则项目标记为已过期并在之后被删除。此处理自动在后台进行,不会影响表的读取或写入流量。

注意

纪元时间格式为自 1970 年 1 月 1 日午夜 12:00:00 UTC 以来的秒数。

重要

DynamoDB 通常在过期 48 小时内删除已过期的项目。项目在过期后真正被删除的确切时间取决于工作负载的性质和表的大小。读取、查询和扫描中仍会显示已过期但尚未删除的项目。这些项仍可以更新,并且保留对更改或删除过期属性的成功更新。

项目删除后,将立即从所有本地二级索引和全局二级索引中删除它们,此方式与标准删除操作的方式最终一致。

例如,假设一个名为 SessionData 的表可跟踪用户的会话历史记录。SessionData 中的每个项目由一个分区键 (UserName) 和一个排序键 (SessionId) 标识。UserNameSessionIdCreationTimeExpirationTime 等其他属性跟踪会话信息。ExpirationTime 属性设置为生存时间 (TTL) 属性(并未显示所有属性):

SessionData

UserName SessionId CreationTime ExpirationTime (TTL) SessionInfo
user1 74686572652773 1461931200 1461938400 {JSON 文档} ...
user2 6e6f7468696e67 1461920400 1461927600 {JSON 文档} ...
user3 746f2073656520 1461922200 1461929400 {JSON 文档} ...
user4 68657265212121 1461925380 1461932580 {JSON 文档}
user5 6e6572642e2e2e 1461920400 1461927600 {JSON 文档} ...
... ... ... ... ...

在本示例中,每个项目在创建时拥有一个 ExpirationTime 属性值。考虑第一个记录:

SessionData

UserName SessionId CreationTime ExpirationTime (TTL) SessionInfo
user1 74686572652773 1461931200 1461938400 {JSON 文档} ...

在本示例中,项目的 CreationTime 设为 2016 年 4 月 29 日(星期五)中午 12:00 UTC,ExpirationTime 设为 2 小时之后,即 2016 年 4 月 29 日(星期五)下午 2:00 UTC。该项目将在纪元格式的当前时间大于 ExpirationTime 属性中的时间时过期。在这种情况下,带有键值 { Username: user1, SessionId: 74686572652773 } 的项目将在下午 2:00 (1461938400) 后过期。

注意

由于过期时间和删除时间之间的潜在延迟,您在查询项目时可能会得到已过期的项目。如果您不希望在发出读取请求时查看过期的项目,则应该筛选掉它们。

为此,请使用筛选表达式 仅返回生存时间过期值大于纪元格式的当前时间的项目。有关更多信息,请参阅 Query 的筛选表达式Scan 的筛选表达式