如何在Redis中查询和表示对象/哈希之间的关系

时间:2011-12-09 01:15:00

标签: nosql redis relationship relation

让我们假设我有一个包含文章和作者的应用程序。它将数据保存在Redis基础中。这些文章存储为哈希,如下面用JSON语法表示的那样:

{ "title" : "My title", "content" : "This is a content", "authorId" : 1}

另外,我的作者用哈希代表:

{ "name": "John Smith", "username" : "jsmith", "password" : "secret", "id" : 1}

问题是,如何检索给定作者ID的所有文章?在Redis中有一些命令可以做到吗?你会手动检索和过滤它们吗?或者我表达这种关系的方式有缺陷吗?你会建议什么?

1 个答案:

答案 0 :(得分:5)

在Redis中,没有直接的方法来使用字段值作为选择标准来检索哈希值。使用您当前的数据模型只能检索所有文章哈希值,然后丢弃那些不匹配的文章哈希值,但这种方法效率很低。

事实是,你必须自己维护索引。因为你不能在哈希中设置集合,所以我通过使用包含作者文章ID的单独集合来实现这一点。这样,你就会有作者的哈希:

author_1: { "name": "John Smith", ... "id": 1 }
author_2: { "name": "Jane Doe", ... "id": 2 }

并为此映射设置:

author_1_articles: [1, 3]
author_2_articles: [2]

它映射到这些文章:

article_1: { "title": "My title", ... "authorId": 1 }
article_2: { "title": "Another one", ... "authorId": 2 }
article_3: { "title": "What a story", ... "authorId": 3 }

现在,当您想要获取作者X的文章时,您只需获取SMEMBERS author_X_articles,您就会获得文章ID列表。

我会使用集合,因为如果您最终多次为作者添加相同的文章,Redis将忽略它。因此,您将获得的文章列表永远不会有重复项,您可以使用SADD而无需先检查文章是否已在该集合中。

这可能听起来像是很多工作,如果您的数据模型很复杂,并且您需要快速制作许多不同的访问模式。您最终要做的是维护自己的索引,对于那些您必须复制数据并使其保持最新的索引。这就是NoSQL的权衡......