我试图实现的想法是一个 id 表。基本上它具有结构(user_id,lecturer_id),其中 user_id 指的是我的 User 表中的主键,而 Lecturer_id 指的是我的 Lecturer 表中的主键。
我正在尝试在redis中实现这一点,但是如果我将键设置为用户的主ID,当我尝试运行查询时,例如获取讲师ID = 5的所有记录,因为讲师不是键,但值我不会能够在 O(1) 时间内到达它。
如何形成我上面提到的 id 表这样的结构,或者 Redis 不支持?
我试图实现的想法是一个 id 表。基本上它具有结构(user_id,lecturer_id),其中 user_id 指的是我的 User 表中的主键,而 Lecturer_id 指的是我的 Lecturer 表中的主键。
我正在尝试在redis中实现这一点,但是如果我将键设置为用户的主ID,当我尝试运行查询时,例如获取讲师ID = 5的所有记录,因为讲师不是键,但值我不会能够在 O(1) 时间内到达它。
如何形成我上面提到的 id 表这样的结构,或者 Redis 不支持?
在使用 redis 时,您可以快速学习的一件事是您可以围绕访问需求设计数据结构,特别是在关系方面(毕竟它不是关系数据库)
正如您已经注意到的那样,无法通过具有 O(1) 时间复杂度的“值”进行搜索,但是有一些方法可以接近您使用 redis 描述的内容。以下是我的建议:
这可能看起来像复制关系的数据,因为您的用户数据必须存储讲座 ID,而您的讲座数据将存储用户 ID,但如果要在不建立关系的情况下,这是(微小的)代价-redis 之类的关系型数据存储。实际上,这很有效。内存很少是小型数据集的瓶颈(想想数千个 id)。
为了更好地了解人们如何使用 redis 对具有关系的应用程序进行建模,我建议阅读Design and implementation of a simple Twitter clone和Lamernews的源代码,两者均由 redis 作者Salvatore Sanfilippo编写。
正如已经回答的那样,在 vanilla Redis 中,无法只存储一次数据并让 Redis 为您查询它们。
您必须自己维护二级索引。
但是,对于 Redis 中的模块,这不是必需的。zeeSQL或RediSearch等模块允许将数据直接存储在 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 ...