【问题标题】:Get last N records in a DynamoDB table获取 DynamoDB 表中的最后 N 条记录
【发布时间】:2013-07-05 18:13:47
【问题描述】:

有没有办法从 dynamodb 表中获取最后 N 条记录。我拥有的范围键是时间戳。所以我可以使用 ScanIndex forward 按时间顺序排列项目。

但是为了查询,我需要一个 hashKey 条件,我不想过滤它。有什么想法吗?

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    DynamoDB 并非旨在以这种方式工作。项目根据 HashKey 上的哈希分布,顺序不可预测。

    您的选择包括:

    • 将项目分组到单个哈希键下(不推荐:您的数据会使一些服务器超载,亚马逊无法保证您的读/写能力)
    • 扫描整个表并保留最近的 N 项(类似于for (item in items) { if (item newer then oldest accumulated item) accumulate item; });
    • 将您的表划分为多个表(即,代替名为Events 的表,为今天的事件创建一个名为Events20130705 的表,为明天的事件创建一个名为Events20130706 的表),然后像上一个选项一样进行扫描——这样您的扫描结果更小

    您也可以更改您的数据模型。例如,您可以有一个 versioned 条目来保留对 N 个最新项目的引用。或者你可以有一个类似单个计数器的东西,你可以增加和更新哈希键下的 N 个其他条目,例如 recent-K 其中 K 是你的计数器 mod N。

    也许您甚至可以使用其他工具来完成这项工作。例如,您可以使用 Redis 服务器来执行此操作。如果不更详细地了解您的用例,就很难做出准确的建议——这应该有多大的可扩展性?它应该有多可靠?您愿意进行多少维护?你愿意为此付出多少?

    通常最好接受限制,了解您的限制并发挥创造力。

    【讨论】:

    • 谢谢。我知道这一点,但值得一试!
    • 看起来这个答案,从 2013 年开始,刚刚被否决。有什么具体原因吗?我在问题的上下文中重新阅读它,它似乎仍然适用(基本上唯一的区别是,2.5 年后,在 2015 年 12 月,DynamoDB 将 Hash 和 Range 重命名为 Partition 和 Sort 键,但它们在概念上是等效的并保留他们在 API 中的原始名称)
    • @BrunoReis:也许有人不喜欢你的回答,因为它不仅仅是简单的工作方式——比如我:-)。有趣的替代品。我正在考虑替代一个(单个散列键)并通过不时移出旧条目来保持表小。我想保留一些实体进行聊天,并且只需要最后可能 100 个条目。
    【解决方案2】:

    我不确定这是否仍然相关。我相当确定您可以使用 ScanIndexForward 和 rangeKey 来获取最新值。

    【讨论】:

    • 那行不通,不幸的是:(原因是 ScanIndexForward 是查询 API 的一个参数,它需要你在 HashKey 上设置一个 EQ 比较,这正是 OP 想要的避免。这意味着 OP 需要提前知道最近使用的 Hash Key(然后问题变得微不足道,但不太可能成为现实世界的问题),或者需要做类似第一个要点的事情我在上面的回答,这仍然(2.5 年后)被认为是一种不好的做法。
    猜你喜欢
    • 2021-12-24
    • 2013-12-31
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2015-04-29
    • 2010-09-30
    相关资源
    最近更新 更多