Redis 按值查找键

Redis 按值查找键,redis,Redis,我试图实现的是一个id表。基本上,它有一个结构(user\u id,讲师id),其中user\u id指的是我的用户表中的主键,讲师id指的是我的讲师表中的主键 我试图在redis中实现这一点,但如果我将键设置为用户的主id,当我尝试运行类似于获取讲师id=5的所有记录的查询时,因为讲师不是键,但值我将无法在O(1)时间内到达它 我如何形成像上面提到的id表那样的结构,或者Redis不支持这种结构?在使用Redis时,您学习得很快的一件事是,您可以围绕访问需求设计数据结构,特别是在关系方面(毕竟

我试图实现的是一个id表。基本上,它有一个结构(user\u id,讲师id),其中user\u id指的是我的用户表中的主键,讲师id指的是我的讲师表中的主键

我试图在redis中实现这一点,但如果我将键设置为用户的主id,当我尝试运行类似于获取讲师id=5的所有记录的查询时,因为讲师不是键,但我将无法在O(1)时间内到达它


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

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

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

  • 按用户id存储用户数据(如散列),就像您正在做的那样
  • 为每个讲师id另外设置一组,其中包含与所讨论的讲师id相对应的所有用户id
这可能看起来像是复制关系的数据,因为您的用户数据必须存储讲座id,而讲座数据将存储用户id,但如果要在redis这样的无关系数据存储中建立关系,这是(微小的)代价。实际上,这很有效;内存很少是小型数据集的瓶颈(想想数千个ID)


为了更好地了解人们是如何使用redis对具有关系的应用程序进行建模的,我建议阅读和的源代码,两者都是由redis作者编写的。

如前所述,在vanilla redis中,无法只存储一次数据并让redis为您查询它们

您必须自己维护二级索引

然而,对于Redis中的模块,这是不必要的。或之类的模块允许将数据直接存储在Redis中,并使用SQL查询(用于zeeSQL)或SimilSQL检索数据

在您的例子中,有一个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 ...

Redis文档中最近添加的一个页面提供了有关此案例的更多信息,并在本节中介绍了此案例。