NoSQL:从表DynamoDB / Azure表存储中获取最新值

时间:2012-10-09 22:24:08

标签: nosql amazon-dynamodb azure-table-storage

我有一个小问题需要一些建议:

  • 假设我们有几百个数据表,每个表都有几十万行。
  • 数据表是时间戳(键) - 值
  • 数据表每秒写一次

每张桌子的最新条目应该可以快速获得,并且最有可能被查询最多 (有点像“实时跟踪数据”)。由于缺少'Last()'或类似,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目以便更快地检索。但是,这会为每个写操作添加额外的更新。此外,大部分流量都集中在这张桌子上(好/坏?)。有没有更好的解决方案,或者我错过了什么?

另外,假设我们要查询数据表中的值。由于扫描显然是不可能的,因此通过复制数据创建二级索引是唯一的选择,有效地使存储要求和写入操作量增加一倍?还有其他解决方案吗?

我主要关注的是DynamoDB和Azure Table Storage,但我也很好奇BigTable如何处理这个问题。

3 个答案:

答案 0 :(得分:33)

我今天刚刚发表了一篇文章,其中包含一些common "recipes" about DynamoDB。其中一个是“存储文章修订,总是最新的”我认为它可能会让你感兴趣:)

简而言之,您可以使用Query(hash_key=..., ScanIndexForward=True, limit=1)

获取最新项目

但是,这假设你有一个range_key_defined。

使用Scan,您没有ScanIndexForward=false这样的参数,无论如何,当数据分布在分区上时,您无法依赖订单,然后Scan请求会进行负载平衡。

为了实现DynamoDB的目标,您可以通过这种方式“分割”您的时间戳:

  1. hash_key:date
  2. range_key:时间或完整时间戳,视情况而定
  3. 然后,您可以使用Query + Limit=1 + ScanIndexForward=false

    的'技巧'

答案 1 :(得分:0)

一般情况下,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的行留在最顶层。

以下是我的博客文章,概述了如何使用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=falseLimit=1来获取最后一项。

答案 2 :(得分:0)

对于发现了该线程但只关心1张桌子的人们:

您可以通过单击列对这些值进行排序来从UI的表中获取最新的项目。