在redis中按联盟名称检索足球比赛的最佳方法是什么?

时间:2016-04-22 05:33:44

标签: redis node-redis

我在redus数据库中保存了数百个足球游戏。它们被保存在密钥下的哈希中:games:soccer:data我有三个z集合将它们分成即将到来的,实时的和结束的。全部按日期(分数)排序。通过这种方式,我可以轻松地检索它们,具体取决于是否即将启动,它们已经发生,或者它们已经结束。现在,我希望能够通过联盟名称检索它们。

我想出了两个选择:

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

第二种选择: 为每个联盟创建关键字,并为每个联盟设置实时,即将到来和已结束的关键字。这样,我认为,检索游戏ID会更快;但是,维持每一套都会很痛苦。

如果您有任何其他方式,请告诉我。我不知道排序是否会更快并为我节省一些时间。

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

编辑 (关注hobbs):

      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设置为我的查询,我不知道如何。

1 个答案:

答案 0 :(得分:0)

一种方法是使用包含每个联赛的所有游戏的SET,并使用ZINTERSTORE计算联盟集与现有集之间的交集。每次查询数据时都可以执行ZINTERSTORE(除非你的数据非常大,否则它不是一个非常昂贵的操作),或者你只能在写一个" parent"设置,或者您可以通过给它一个简短的TTL将其视为一种缓存,并且只有在您去查询它时它不存在时才创建它。