让我们假设我有一个有文章和作者的应用程序.它将数据保存在Redis基础中.这些文章存储为哈希,如下面以JSON语法表示的那样:
{ "title" : "My title", "content" : "This is a content", "authorId" : 1}
另外,我的作者用哈希代表:
{ "name": "John Smith", "username" : "jsmith", "password" : "secret", "id" : 1}
问题是,如何获取给定作者ID的所有文章?在Redis中有一些命令可以做到吗?你会手动检索和过滤它们吗?或者我表达这种关系的方式有缺陷吗?你会建议什么?
在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的权衡......