NoSQL:从DynamoDB/Azure表存储中获取最新值
我有一个小问题需要一些建议:NoSQL:从DynamoDB/Azure表存储中获取最新值,nosql,amazon-dynamodb,azure-table-storage,Nosql,Amazon Dynamodb,Azure Table Storage,我有一个小问题需要一些建议: 假设我们有几百个数据表,每个表有几千万行 数据表是时间戳(键)-值 数据表每秒写入一次 每个表的最新条目应该可以很快获得,并且最有可能被查询到 (有点像“实时跟踪数据”)。由于缺少“Last()”或类似的内容,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目,以便更快地检索。但是,这将为每个写入操作添加额外的更新。此外,大部分流量将集中在该表上(好/坏?)。是否有更好的解决方案,或者我遗漏了什么 另外,假设我们要查询数据表中的值。
- 假设我们有几百个数据表,每个表有几千万行
- 数据表是时间戳(键)-值
- 数据表每秒写入一次
我主要关注的是DynamoDB和Azure表存储,但我也很好奇BigTable是如何处理这个问题的。一般来说,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的一行保留在顶部 下面是我的一篇博客文章,概述了如何使用Windows Azure存储实现这一点: 更新
我在一个项目中使用了DynamoDB,但是非常简单,所以我没有太多经验。也就是说,建议您只需指定
ScanIndexForward=false
和Limit=1
即可获取最后一项。我今天刚刚发表了一篇文章,其中包含一些内容。其中之一是“存储文章修订,始终获取最新版本”,我想这可能会引起您的兴趣:)
简而言之,您可以使用Query(hash_key=…,ScanIndexForward=True,limit=1)获取最新的项目。
但是,这假设您定义了一个范围键
使用Scan
,您没有像ScanIndexForward=false
这样的参数,而且无论如何,您不能依赖顺序,因为数据分布在分区上,Scan
请求随后是负载平衡的
为了使用DynamoDB实现您的目标,您可以通过以下方式“拆分”时间戳:
散列键
:日期range\u key
:时间或完整时间戳,根据您的喜好而定然后,您可以使用
Query
+Limit=1
+ScanIndexForward=false
的“技巧”来帮助找到此线程但只关心1个表的人:
您可以通过单击列按这些值排序,从UI中的表中获取最新项目。谢谢您的回答。我没有考虑过这样解决它,尽管我对时间戳的格式有点犹豫,因为它是“数据的一部分”,因此它将被查询,并且应该是用户可以理解的格式。使用此解决方案,我必须重新处理每个时间戳,以反转每个查询的转换。我建议以正常表示形式存储另一个带有时间戳的列。感谢您的回答,您的文章非常有趣。不过,关于ScanIndexForward,我还有一个问题。文档中说:
指定索引的升序或降序遍历…
ScanIndexForward是否像GROUP BY一样工作,只是颠倒查询结果的顺序,还是实际按相反的顺序读取range_键,即这需要多少次读取?我担心的是,到一天结束时(假设1次写入/秒),有超过86k个条目,并且在获取最新值时不断地反复检查它们会很昂贵。range\u键
被编入索引,因此它是高效的,使用Query
,您只需为检索到的结果付费。也就是说,我不知道这是如何在内部实现的。只是提醒一下:在我的情况下,我需要ScanIndexForward=False
而不是True
。默认行为可能在文章撰写后的某个时候发生了变化。读取的文档:如果ScanIndexForward为true,DynamoDB将按范围键按顺序返回结果。这是默认行为。如果ScanIndexForward为false,则DynamoDB将按范围键按降序对结果进行排序,然后将结果返回给客户端。到目前为止,ScanIndexForward似乎已被具有相同含义的BackwardSearch替换。遗憾的是,我找不到任何有关此更改的文档。您在此处的链接似乎已过期。我发现这个页面上可能有相同的内容,只对当前页面的结果进行排序(~100条记录),大概是为了避免扫描整个表。