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