amazon-dynamodb - DynamoDB TTL 是否适用于预先存在的项目?
问题描述
我有一个 DynamoDB 表,里面有一堆项目。我已将表配置为使用属性“过期”作为 TTL 属性。然后我在我的系统中引入了一个错误,我保存了所有具有“到期”属性的项目(doh!)。
为了解决这个问题,我关闭了表上的 TTL 支持,然后使用属性“expiry”重新启用它。当所有过期物品都消失时,应该有一个惊天动地的大爆炸。没有。我等了 24 小时,以防 Dynamo 需要醒来并注意我的桌子。没有惊天动地的kaboom(悲伤的火星人......)。
我现在想知道在正确属性上启用 TTL 之前表中的项目是否真的错过了 TTL 船,并且会一直保留在那里直到手动删除。我错过了什么?有没有其他人经历过这个?
解决方案
是的,DynamoDB 应该删除过期的项目,即使它们是在选择 TTL 列之前创建的。至少,文档中没有任何其他建议。文档解释了 TTL 的工作原理:
DynamoDB 将当前时间(以纪元时间格式)与存储在项目的用户定义的 Number 属性中的值进行比较。如果属性的值是纪元时间格式,小于当前时间,并且不超过 5 年,则删除该项目。处理在后台自动进行。
你说你等了 24 小时才发生删除。也许这还不够,因为同一份文件还说:
DynamoDB 通常会在过期后 48 小时内删除过期项目。过期后项目真正被删除的确切持续时间取决于工作负载的性质和表的大小。
48小时过去了,能再查一下吗?
更新(基于上面的讨论): 如果 TTL 功能似乎不起作用,您应该确保正确设置 TTL 属性。首先确保您使用正确的名称设置属性(这是提问者的第一个问题)。然后,您应该确保在此属性中设置一个整数值(它不能是字符串!)。最后确保这个整数是自纪元以来的秒数(格林威治标准时间午夜,1970 年 1 月 1 日)——提问者在这里不小心使用了毫秒而不是秒,所以它不起作用。
推荐阅读
- c# - 具有客户端权限的 UNET 对象池 (C#)
- javascript - 如何添加 for 循环返回的数字?
- javascript - 在 Node.js 中使用 Cognito 凭据登录并调用 API 网关
- python - 为什么我的 nltk.pos_tag 标记字母而不是单词
- javascript - 自动完成半径搜索在我的谷歌地图中不起作用
- collections - Kotlin Collections 标准库中的这些函数是重复的,还是有细微的差别?
- java - 如何从java中的while循环返回String的所有值?
- regex - 正则表达式提取数据
- amazon-web-services - 在 CloudFormation 模板中自动设置 ListenerRule 优先级
- scala - 火花数据集的正确单子 flatMap 操作?