在 DynamoDB 表中获取最近的 N 条记录。

23

有没有办法从 DynamoDB 表中获取最后 N 条记录。我的范围键是时间戳。因此,我可以使用 ScanIndex 正向排序项目,以时间顺序排列。

但是为了查询,我需要拥有一个哈希键条件,但我不想进行过滤。有什么想法?

2个回答

24

DynamoDB不是为此设计的。项目根据哈希键上的哈希分配,这样顺序是不可预测的。

您有几个选项:

  • 将项目分组到单个哈希键下(不建议:会使少数服务器超载,并且亚马逊无法保证读/写容量)
  • 扫描整个表并保留N个最新项目(类似于for(item in items){if(item新于累积的最旧项目)累积项目; } );
  • 将您的表分成多个表(即,不是一个名为Events的表,而是创建一个名为Events20130705的表来存储今天的事件,Events20130706用于明天的事件等),然后像以前的选项一样进行扫描--这样扫描范围更小

您也可以更改数据模型。例如,您可以有一个“版本化”的条目,该条目将保留对N个最新项的引用。或者您可以拥有一个类似于单个计数器的东西,您可以将其增加并更新K mod N的哈希键下的其他N个条目,其中K是您的计数器。

也许您甚至可以使用另一个工具来完成此工作。例如,您可以拥有一个Redis服务器来执行此操作。如果没有更详细的了解您的用例,很难提出精确的建议--它应该具有多大的可扩展性?它应该是多么可靠?您愿意执行多少维护工作?您愿意为此支付多少费用?

通常最好接受限制,了解约束并创造性地解决问题。


谢谢。我知道这个,但还是值得一试问一下! - Adi GuN
4
看起来这个来自2013年的回答刚刚被踩了。有具体的原因吗?我在问题的背景下重新阅读了它,似乎仍然适用(基本上唯一的区别是,在2015年12月,DynamoDB将Hash和Range重命名为Partition和Sort key,但它们在概念上等效,并保留了它们的原始名称在API中)。 - Bruno Reis
@BrunoReis:也许有人不喜欢你的回答,认为它并不容易 - 就像我一样 :-)。有趣的替代方案。我正在考虑第一个替代方案(单哈希键),并通过定期删除旧条目来保持表的小型化。我想保存一些聊天实体,只需要最近的100个条目。 - timguy

0

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


4
很不幸,那行不通:( 原因在于ScanIndexForward是Query API的一个参数,它要求您在HashKey上设置EQ比较,而这正是OP想避免的。这意味着OP需要提前知道最近使用的Hash Key(然后问题就变得很简单,但很不可能成为真实世界中的问题),或者需要像我上面答案中的第一个要点那样做,但即使经过了2.5年,它仍然被认为是一种不好的实践。 - Bruno Reis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接