从riak的桶中获取一个对象,而不知道其钥匙



我正在使用riak存储桶来存储消息列表,将uuid用作密钥和json消息作为值。这很好。

我需要的是一种有效的方法从存储桶中获取一条消息而不知道其键,至少在这两种情况之一中:

  1. 获取最后一个插入的对象(这是我最喜欢的方法)。
  2. 从存储桶中获取一个随机对象(如果不可能的话)。

有没有有效的方法来实现这一目标?

我认为一种选择是在水桶中取回钥匙,然后获取第一个键。但这意味着要对Riak进行两个呼叫,一个来获取所有键(仅仅丢弃一个键),然后再获得第二个键来获取对象。它似乎不是很有效。

riak是一个钥匙值存储,远到远的数据是通过键检索数据的最有效方法。即使您最终首先使用返回的钥匙,列表或检索所有键也是您可以执行的效率最低的操作之一,因为它会导致RIAK扫描系统中的所有键(不仅是水桶),并且通常建议不要在生产系统上使用它。

获取最后一个插入对象的最有效方法可能是将ID存储在单独的已知记录中,以不同的存储桶中。但是,这将要求您在每个插入文章上执行两个写作,并为每个读取两次读取,但会以最有效的方式进行。您可能会在包含消息的存储桶上实现后签名(必须在Erlang中,因为目前不可能使用JavaScript函数编写记录),以使系统为您执行更新,这将删除需要最后写。

如果将大量数据写入包含消息的存储桶,则可能需要调整单独的存储桶,以便它不允许多个值,并且最后一个值将获胜。这样,由于对整个系统的单个记录进行了频繁的更新,您将降低创建大量兄弟姐妹的风险。这始终会为您提供最后的书面记录之一,但不一定是最后一个记录(尤其是如果您经常向数据库写消息),因为Riak不支持任何类型的原子性,并且最终是一个一致的数据库。

,如果您使用的是LevelDB后端,也可以创建一个或多个辅助索引,并使用它将扫描限制在最近的记录中,这比所有键的扫描都更有效。然后,您可以通过MapReduce选择最新的密钥或随机密钥,但这效率要比先前描述的方法要少得多。

除非您知道插入的键范围,并且可以随机决定要获得的端子,否则我无法想到从Riak中检索随机记录的任何有效方法。做到这一点的一种方法是按顺序生成所有键,而不是使用UUID,但是在高度并发的分布式系统中,这自然不是一个好主意。

第一任务非常容易实现:

  • 添加将在某些预定义的钥匙/桶位置写的最后一个插入键
  • 从该预定义的钥匙/存储桶中获取钥匙,并使用它们发出查询

这仍然是两个操作,但两者都得到了很快。加上钩子上的其他开销,但也没有太重。

第二场景也很容易,但是它效率过低,无法实际使用:

  • 获取所有键(非常昂贵的操作)
  • 选择随机
  • 问题获取

我提出了相同的情况。在我的情况下,我必须保存用户。为此,我需要一个自动增量ID。因此,我所做的是,我将最后一个插入的密钥放在单独的桶中,如" Christian Dahlqvist"所述,每次我想插入新唱片时,我都会从该钥匙桶中获取最后一个插入的键。在这里,我们只有一个值,其中一个值是" lastKey",我们总是知道的。我根据获取的密钥汇总了密钥,并再次更新了钥匙存储桶。因此,始终包含其中的最新键。

最新更新