【问题标题】:What is the best way to retrieve soccer games by league names in redis?在redis中按联赛名称检索足球比赛的最佳方法是什么?
【发布时间】:2016-04-23 00:26:33
【问题描述】:

我的 redus 数据库中保存了数百场足球比赛。它们保存在密钥下的哈希中:games:soccer:data 我有三个 z 集来将它们分类为即将到来的、活动的和结束的。所有按日期(分数)排序。通过这种方式,我可以轻松地检索它们,具体取决于它们是否即将开始、它们已经在发生或它们已经结束。现在,我希望能够通过联赛名称检索它们。

我想出了两个选择:

第一种选择:保存包含游戏 ID 和联赛名称的单个哈希值。通过这种方式,我可以获得所有实时游戏 id,然后根据各自的哈希值检查每个 id,如果它与我想要的联赛名称匹配,那么我将它推入一个数组,如果不是,我跳过它。最后,返回包含我想要的联赛的所有游戏 ID 的数组。

第二种选择:为每个联赛创建密钥,并为每个联赛创建实时、即将到来和结束的集合。我认为这样检索游戏ID会更快;但是,维护每个集合会很痛苦。

如果您有其他方法,请告诉我。我不知道排序是否会更快并节省一些内存。

我正在寻找速度和低内存使用率。

编辑(遵循霍布斯替代方案):

      const multi = client.multi();
      const tempSet = 'users:data:14:sports:soccer:lists:temp_' + getTimestamp();

      return multi
      .sunionstore(
        tempSet,
        [
          'sports:soccer:lists:leagueNames:Bundesliga',
          'sports:soccer:lists:leagueNames:La Liga'
        ]
      )
      .zinterstore(
        'users:data:14:sports:soccer:lists:live',
        2,
        'sports:lists:live',
        tempSet
      )
      .del(tempSet)
      .execAsync()

我需要将AGGREGATE MAX 设置为我的查询,但我不知道该怎么做。

【问题讨论】:

    标签: redis node-redis


    【解决方案1】:

    一种方法是使用包含每个联赛所有比赛的 SET,并使用 ZINTERSTORE 计算您的联赛集和现有集之间的交集。您可以在每次查询数据时执行 ZINTERSTORE(除非您的数据非常大,否则这不是一个非常昂贵的操作),或者您只能在写入“父”集之一时执行此操作,或者您可以将其视为通过给它一个短 TTL 并仅在您去查询它时它不存在时才创建它来排序缓存。

    【讨论】:

    • 如果这个包含每个联赛所有比赛的 SET 变得非常大,包含数千个条目,会发生什么?它的大小重要吗?
    • @ElPirru 确实很重要,但数千并不是“很大”,也不太可能成为问题。但可以肯定的是,创建一些测试数据并衡量性能!
    • 我将运行一些测试并返回结果。我可以删除超过 x 时间的游戏以保持大小“小”,或者有两个 SET,一个包含一个月以上的新游戏,另一个包含其余游戏的列表。如果我从它的哈希中检索一个游戏的联赛,然后从那里制作一个新系列怎么办?这将使用我猜的排序功能....
    • 我很难用两个以上的键实现 zinterstore,我找不到在 node-redis 中设置 AGGREGATE MAX 的方法。我可以为每个联赛准备多套,还是只需要一套?因为现在,看来我需要先在联赛套装上做 sunion,然后再申请 zinterstore。您能否提供一个在节点 redis 中设置 AGGREGATE MAX 的示例?我尝试在谷歌上查找它,但没有找到任何示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多