如何使用Boto使dynamoDB中的密钥失效?

时间:2012-02-18 18:26:28

标签: python key-value boto amazon-dynamodb

我正试图从redis迁移到dynamoDB,并且一切都工作得很好!我唯一还没想到的是密钥过期。目前,我的数据设置有一个主键,没有范围键,因此:

{
  "key" => string,
  "value" => ["string", "string"],
  "timestamp" => seconds since epoch
}

我在想的是在数据库上扫描时间戳小于特定值的位置,然后明确删除它们。然而,这看起来非常低效,并且会无缘无故地耗尽一些荒谬的读/写单元!最重要的是,只有在我运行扫描时才会发生这种情况,因此它们可以构建起来。

那么,有没有人找到解决这个问题的好方法呢?

4 个答案:

答案 0 :(得分:7)

我也像使用Redis一样使用DynamoDB。

我的建议是将密钥写入不同的时间表

例如,假设一种记录应该持续几分钟,最多不到一小时,那么你可以

  1. 每天为此类记录创建一个新表,并在今天的表中存储新记录。
  2. 当您阅读记录时使用读取修复提示,这意味着如果您在今天的表格中找不到记录,您可以尝试在昨天的表格中找到它并在必要时放入今天的表格中。
  3. 如果您在任一表中找到记录,请使用它的时间戳验证它。此时没有必要删除过期的记录。
  4. 删除任务中的所有陈旧表格。
  5. 这更易于维护且具有成本效益。

答案 1 :(得分:5)

您可以执行延迟过期并根据请求将其删除。

例如:

  • 存储具有属性“expiration”的密钥“a”,在10分钟后到期。
  • 在9分钟内获取,检查过期,然后返回。
  • 在11分钟内取。检查到期日。因为它比现在少,所以删除条目。

几年前,当我查看源代码时,这就是memcached所做的事情。

您仍然需要扫描以删除所有旧条目。

您还可以考虑使用Elasticache,它用于缓存而不是永久数据存储。

答案 2 :(得分:2)

似乎亚马逊刚刚为DynamoDB添加了过期支持(截至2017年2月27日)。看看官方博客文章:

https://aws.amazon.com/blogs/aws/new-manage-dynamodb-items-using-time-to-live-ttl/

答案 3 :(得分:1)

您可以使用时间戳作为索引的范围键,并允许根据时间更轻松地进行操作。