正确使用伏地魔作为键值对?

Posted

技术标签:

【中文标题】正确使用伏地魔作为键值对?【英文标题】:Correct usage of Voldemort as key-value pair? 【发布时间】:2010-04-01 19:54:19 【问题描述】:

我想了解,伏地魔如何使用?说,我有这种情况:

因为,Voldemort 是一个键值对。 我需要根据 3 个参数获取一个值(比如一些文本)。

那么,在这种情况下,关键是什么?我不能对 1 个值使用 3 个键,但是应该可以根据这 3 个参数搜索该值。

我说得有道理吗?

谢谢

EDIT1

例如:一个博客系统。用户发布博客:存储的用户数据:姓名、年龄和性别 存储博客内容(文本)。

现在,如果用户从前端搜索 Sex: Male 的所有博客文章,我需要在这里使用 Voldemort

然后,我的代码应该查询 voldemort 并返回所有性别为男性的“博客内容(文本)”。

所以,根据我的理解:

Key = Name, Age and Sex
Value = Text

我正在使用 Java。

【问题讨论】:

【参考方案1】:

已编辑答案以适合添加到问题的示例:

要了解 Voldemort 是一个非常简单的键值对存储。据我所知,only 你能做的就是在一个键下存储一个值,然后通过键获取这些值。因此,对于您的示例案例,如果您真的想使用 Voldemort,您有几个选择。

例如,您曾说过您正在为用户存储数据。所以,你可能会有这样的事情:

Key = user-Chad
Value = Name:Chad Birch, Age:26, Sex:Male

现在,如果我想发布新的博客文章,您还需要将其存储在密钥下。所以你可以这样做:

Key = blog-Chad1
Value = Here is my very first blog post.

现在,您的问题是您需要某种方式来查找用户使用 Sex:Male 发布的所有博客文章,但无法直接获取这些数据。此时,您必须:

    拉出每个用户,检查他们是否是男性,如果是,请拉出他们的博客文章。 开始在其他键值对中存储更多内容,以便您查找。

要实现 #2,您可以像这样添加另一对:

Key = search-Sex:Male
Value = Chad1 Chad2 Steve1 ...

然后,当有人搜索 Sex:Male 时,您提取此值,将其拆分,然后获取所有这些博客文章。

这有意义吗?使用 k-v 存储与数据库有很大不同,因为您失去了所有这些关系能力。

【讨论】:

您建议的答案是使用Voldemort(键值对)的解决方法或正确方法 这是一个很棒的解决方案,所以告诉我,如果我使用你建议的方法,我实际上是在扭曲 Voldemort 的实际目的并且不必要地使用它,或者这是正确的吗? 好吧,你不能真正“扭曲”它的目的。 Voldemort 所做的只是获取值并将它们存储在键下。它不关心他们是什么。您需要弄清楚的是,在存储更多 k-v 对以加快查找速度(这使得每当有人发布内容时您必须进行大量更改)或存储更少但需要重复查找以获取信息之间取得平衡你想要的。 例如,在我给出的示例中,每次男性用户发表新的博客文章时,您都必须拔出 search-Sex:Male 键并更改其值以包含新的邮政。但是,如果您只存储男性用户列表,则不必这样做。但是,当有人搜索男性的帖子时,您必须进行额外的查找。首先,您必须获取所有男性用户的列表,然后您必须获取他们所有帖子的列表,而不是直接查看结果。【参考方案2】:

我认为您不能直接使用键值存储来做到这一点,但一种解决方法是将用户存储在多个位置。

例如,您有一个用户到博客文章列表的键值映射。您还可以将年龄映射到用户列表。也是用户列表的性别。现在,如果您想按年龄或性别进行搜索,您可以拉取相应的用户列表,然后拉取他们所有的博文。

像 Voldemort 这样的键值存储可以工作的部分原因是存储和查询足够便宜,您可以做额外的。

不过,上述方案的问题在于,如果您以分布式方式使用 Voldemort,则最好使用大量映射到短数据列表的键(因此您可以基于键进行分发)像将性别映射到用户这样的事情会违反(只有几个键,每个键都有可能非常大的数据列表)。

【讨论】:

以上是关于正确使用伏地魔作为键值对?的主要内容,如果未能解决你的问题,请参考以下文章

使用列表中的每个值作为键值对中的键

多键值对搜索

怎么在 c++ 的 map 里面 放 key-map键值对

键值对解析

键值对的聚类

下篇1:将 ConfigMap 中的键值对作为容器的环境变量