gpt4 book ai didi

sorting - 在 Raik 中高效的创建时间降序查找

转载 作者:行者123 更新时间:2023-12-04 04:38:33 24 4
gpt4 key购买 nike

我正在学习使用 NoSQL 引擎 Raik。鉴于我有一个包含帖子的用户“时间线”,并且该帖子的范围可能从数百万到数十亿不等,我如何从 raik 存储桶中取出最后 N 个帖子?我的意思是,最后创建的。

我读到使用二级索引时,Raik 将返回按关键字排序的帖子。所以我决定使用 UUID1 作为帖子键,并为帖子作者设置二级索引,这样我就可以使用它的键从该作者那里获取所有帖子。

然而,帖子是按升序排列的!我还想使用 max_results 参数作为 SQL LIMIT。

但是,此查询返回该用户的前 N ​​个帖子,而不是最后一个。鉴于我已经看到了一些 StackOverflow 帖子,并且建议的解决方案 MapReduce 对于大存储桶效率不高,您将如何对数据建模或编写查询?

谢谢

最佳答案

当来自 SQL 环境时,很容易将存储桶视为表并在其中存储小的单个记录,通常依靠二级索引来获取数据。由于 Riak 是使用一致散列的键值存储,但这通常不是最有效或可扩展的方法。

Riak中基于key的查找可以直接识别保存数据的分区,协调节点可以直接查询这些分区。查询 secondary index 时, Riak 不知道可能与索引匹配的数据将驻留在哪些分区上。因此,它需要将查询发送到大量分区,以确保可以找到所有匹配的对象。这称为“覆盖查询”,这意味着,假设存储桶使用的 n_val 为 3,则至少需要查询所有分区的 1/3。这通常会导致集群负载更高,并且无法像直接键查找那样扩展。延迟也往往更高。

因此,在使用 Riak 时,通常建议您对数据进行结构化,以便尽可能多地使用直接键查找,例如通过去规范化。

如果您的消息/帖子可以以某种方式分组,例如根据用户或对话,将它们存储在表示此分组的单个对象中而不是作为单独的对象存储可能是有意义的。

如果我们假设您的帖子可以由文本或图像组成并链接到对话线程,则您可以创建一个代表对话线程的对象。这将包含有关对话的信息以及帖子列表。这个帖子列表可以例如包含发布者的 id、时间戳和包含该帖子的记录的键。如果帖子是一段相当短的文本消息,它甚至可能包含整个帖子,从而减少需要获取的记录数量。

当帖子进入此对话时,记录会更新并且帖子列表会变长。设置 allow_mult 可能是明智的为 true 以启用 sibling ,因为这将允许您处理并发写入。这种方法使您始终可以通过单个直接键查找来获取对话以及最新帖子。

当对象的大小保持在几 MB 以下时,Riak 效果最佳。因此,您需要在某个时候将最旧的帖子移到一个单独的对象,以控制大小。如果您在主对话对象中保留这些相关对象的列表,可能连同有关它们涵盖的时间间隔的一些信息,如果您需要回滚旧帖子,您也可以通过直接键查找轻松访问这些对象。

由于最常见的查询通常是针对最近的条目,因此这始终可以通过主对话对象来完成。

我还要指出,我们确实有一个非常活跃的 mailing list这类问题经常被讨论。

关于sorting - 在 Raik 中高效的创建时间降序查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19279423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com