31

我试图实现的想法是一个 id 表。基本上它具有结构(user_id,lecturer_id),其中 user_id 指的是我的 User 表中的主键,而 Lecturer_id 指的是我的 Lecturer 表中的主键。

我正在尝试在redis中实现这一点,但是如果我将键设置为用户的主ID,当我尝试运行查询时,例如获取讲师ID = 5的所有记录,因为讲师不是键,但我不会能够在 O(1) 时间内到达它。

如何形成我上面提到的 id 表这样的结构,或者 Redis 不支持?

4

2 回答 2

37

在使用 redis 时,您可以快速学习的一件事是您可以围绕访问需求设计数据结构,特别是在关系方面(毕竟它不是关系数据库)

正如您已经注意到的那样,无法通过具有 O(1) 时间复杂度的“值”进行搜索,但是有一些方法可以接近您使用 redis 描述的内容。以下是我的建议:

  • 正如您已经在做的那样,通过用户 ID(例如哈希)存储您的用户数据。
  • 为每个讲师 ID 设置一个附加集,其中包含与相关讲师 ID 对应的所有用户 ID。

这可能看起来像复制关系的数据,因为您的用户数据必须存储讲座 ID,而您的讲座数据将存储用户 ID,但如果要在不建立关系的情况下,这是(微小的)代价-redis 之类的关系型数据存储。实际上,这很有效。内存很少是小型数据集的瓶颈(想想数千个 id)。

为了更好地了解人们如何使用 redis 对具有关系的应用程序进行建模,我建议阅读Design and implementation of a simple Twitter cloneLamernews的源代码,两者均由 redis 作者Salvatore Sanfilippo编写。

于 2012-10-05T13:41:52.937 回答
0

正如已经回答的那样,在 vanilla Redis 中,无法只存储一次数据并让 Redis 为您查询它们。

您必须自己维护二级索引。

但是,对于 Redis 中的模块,这不是必需的。zeeSQLRediSearch等模块允许将数据直接存储在 Redis 中,并使用 SQL 查询(用于 zeeSQL)或类似 SQL 用于 RediSearch 来检索它们。

在你的情况下,一个 zeeSQL 的小例子。

> ZEESQL.CREATE_DB DB
OK
> ZEESQL.EXEC DB COMMAND "CREATE TABLE user(user_id INT, lecture_id INT);"
OK
> ZEESQL.EXEC DB COMMAND "SELECT * FROM user WHERE lecture_id = 3;"
... your result ...
于 2021-03-01T22:13:27.657 回答