gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:03:46 32 4
gpt4 key购买 nike

让我们假设我有一个包含文章和作者的应用程序。它将其数据保存在 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 的权衡...

关于nosql - 如何在 Redis 中查询和表示对象/哈希之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439930/

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