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