按值查找键

时间:2012-10-05 12:00:02

标签: redis

我想要实现的想法是一个id表。基本上它有结构(user_id,lecturer_id),其中user_id引用我的User表中的主键,lecturer_id引用我的Lecturer表的主键。

我正在尝试在redis中实现此功能但是如果我将密钥设置为用户的主要ID,当我尝试运行像这样的查询时,获取讲师id为5的所有记录,因为讲师是不是关键,而是我将无法在O(1)时间内达到它。

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

2 个答案:

答案 0 :(得分:29)

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

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

  • 按用户ID(例如哈希)存储您的用户数据,如您所知。
  • 为每位讲师ID设置一个附加集,其中包含与相关讲师ID相对应的所有用户ID。

这似乎与关系数据重复,因为您的用户数据必须存储讲义ID,而您的讲座数据将存储用户ID,但如果要建立关系,这是(微小的)代价。在像redis这样的无关系数据存储中。实际上,这很有效;内存很少成为小型数据集的瓶颈(想想成千上万的ID)。

为了更好地了解人们如何使用redis为关系建模应用程序,我建议阅读Design and implementation of a simple Twitter cloneLamernews的源代码,这两者都是由redis作者{{3}编写的。 }}

答案 1 :(得分:0)

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

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

但是对于 Redis 中的模块,这不一定是真的。 zeeSQLRediSearch 等模块允许将数据直接存储在 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 ...