【问题标题】:Find key by value按值查找键
【发布时间】:2012-09-26 14:01:20
【问题描述】:

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

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

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

【问题讨论】:

标签: redis


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    正如已经回答的那样,在 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 ...
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多