NoSQL:从表 DynamoDB/Azure 表存储中获取最新值
Posted
技术标签:
【中文标题】NoSQL:从表 DynamoDB/Azure 表存储中获取最新值【英文标题】:NoSQL: Getting the latest values from tables DynamoDB/Azure Table Storage 【发布时间】:2012-09-30 07:56:52 【问题描述】:我有一个小问题需要一些建议:
假设我们有几百个数据表,每个表有几千万行。 数据表是时间戳(键)-值 数据表每秒写入一次每个表的最新条目应该可以快速获得,并且最有可能被查询 (有点像“实时跟踪数据”)。由于缺少“Last()”或类似内容,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目以便更快地检索。但是,这将为每个写入操作添加额外的更新。此外,大部分流量将集中在这张桌子上(好/坏?)。有没有更好的解决方案或者我错过了什么?
另外,假设我们要查询数据表中的值。既然扫描显然是不可能的,那么唯一的选择是通过复制数据来创建二级索引,有效地使存储需求和写入操作量翻倍吗?还有其他解决方案吗?
我主要关注 DynamoDB 和 Azure 表存储,但我也很好奇 BigTable 是如何处理这些的。
【问题讨论】:
【参考方案1】:我今天刚刚发表了一篇文章,其中有一些 common "recipes" about DynamoDB。其中之一是“存储文章修订,始终保持最新”,我认为您可能会感兴趣 :)
简而言之,您可以使用Query(hash_key=..., ScanIndexForward=True, limit=1)
获取最新项目
但是,这假设您有一个 range_key_defined。
使用Scan
,您没有ScanIndexForward=false
这样的参数,无论如何,您不能依赖顺序,因为数据分布在分区上,然后Scan
请求会被负载平衡。
要使用 DynamoDB 实现您的目标,您可以通过这种方式“拆分”您的时间戳:
hash_key
:日期
range_key
:时间或完整时间戳,随你喜欢
那么,你就可以使用Query
+ Limit=1
+ ScanIndexForward=false
的‘技巧’了
【讨论】:
感谢您的回答,您的文章读起来很有趣。我仍然有一个关于 ScanIndexForward 的问题。文档说:Specifies ascending or descending traversal of the index...
ScanIndexForward 是否像 GROUP BY 一样工作,只是颠倒查询结果的顺序,还是实际上以相反的顺序读取 range_key,即这需要多少次读取?我担心的是,到一天结束时(假设 1 次写入/秒)有超过 86k 条目,并且在获取最新值时会不断地一遍又一遍地查看它们。
range_key
已编入索引,因此它很高效,而使用Query
,您只需为检索到的结果付费。说了这么多,不知道内部是怎么实现的。
请注意:就我而言,我需要ScanIndexForward=False
而不是True
。默认行为可能在文章撰写后的某个时候发生了变化。 query
method 的文档如下:如果 ScanIndexForward 为 true ,DynamoDB 按范围键按顺序返回结果。这是默认行为。如果 ScanIndexForward 为 false,则 DynamoDB 按范围键对结果进行降序排序,然后将结果返回给客户端。
到目前为止,似乎 ScanIndexForward 已被 BackwardSearch 替换,具有相同的含义。不幸的是,我找不到任何有关此更改的文档。
您在此处的链接似乎已过期。我在blog.yadutaf.fr/2012/10/07/… 上发现了相同的内容【参考方案2】:
一般来说,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的行留在顶部。
这是我的一篇博文,概述了如何使用 Windows Azure 存储:http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure。
更新
我在一个项目中使用 DynamoDB,但方式非常简单,所以我没有太多经验。也就是说,http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html 向我建议您可以指定 ScanIndexForward=false
和 Limit=1
来获取最后一项。
【讨论】:
感谢您的回答。没有考虑过尝试这样解决它,尽管我对格式化时间戳有点犹豫,因为它是“数据的一部分”,因此它将被查询并且它应该是用户可以使用的格式理解。使用此解决方案,我必须重新处理每个时间戳以反转每个查询的转换。 我建议以正常表示形式存储另一个带有时间戳的列。【参考方案3】:对于发现此线程但只关心 1 个表的人:
您可以从 UI 中的表中获取最新项目,方法是单击列以按这些值排序。
【讨论】:
这只对当前页面的结果(~100条记录)进行排序,大概是为了避免扫描整个表。以上是关于NoSQL:从表 DynamoDB/Azure 表存储中获取最新值的主要内容,如果未能解决你的问题,请参考以下文章