5

我正在尝试从 redis 迁移到 dynamoDB,到目前为止一切都很好!我唯一还没有弄清楚的是密钥过期。目前,我的数据设置只有一个主键,没有范围键,如下所示:

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

我当时的想法是扫描数据库以查找时间戳小于特定值的位置,然后显式删除它们。然而,这似乎效率极低,并且会无缘无故地使用大量的读/写单元!最重要的是,到期只会在我运行扫描时发生,因此可以想象它们会累积。

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

4

4 回答 4

7

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

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

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

  1. 每天为这种类型的记录创建一个新表,并将新记录存储在今天的表中。
  2. 在读取记录时使用读取修复提示,这意味着如果在今天的表中找不到记录,则尝试在昨天的表中找到它,并在必要时放入今天的表中。
  3. 如果您在任一表中找到记录,请使用其时间戳进行验证。此时不需要删除过期记录。
  4. 在您的任务中删除整个陈旧的表。

这更易于维护且具有成本效益。

于 2014-01-24T03:08:17.487 回答
5

您可以进行延迟到期并根据要求将其删除。

例如:

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

这就是几年前我查看源代码时 memcached 正在做的事情。

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

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

于 2012-05-01T20:10:30.907 回答
2

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

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

于 2017-03-07T11:27:29.227 回答
1

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

于 2012-02-18T18:29:49.153 回答