Redis:将多个ZSET排序集合分组并求和为一个排序集合

3
如果我有两个具有不同成员集和不同分数的已排序集合:
ZADD set1 10 "player1"
ZADD set1 15 "player2"
ZADD set1 5 "player3"

ZADD set2 30 "player1"
ZADD set2 22 "player3"

我需要通过对所有玩家进行分组并将其得分相加来合并上述两个集合,结果应该如下:

set3 40 "player1"
set3 15 "player2"
set3 27 "player3"

我尝试的一种方法是将这些数据获取到Ruby对象中并进行分组逻辑。我正在寻找在Redis中执行此操作的方法。

1个回答

7

你很幸运,因为Redis已经支持此功能!

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

概述:交集计算多个有序集合并将结果存储在新的键中。

所以在您的情况下:

ZINTERSTORE set3 2 set1 set2 AGGREGATE SUM

看这里!set3包含了得分总和的共同球员:

127.0.0.1:6379> ZRANGE set3 0 -1 WITHSCORES
1) "player3"
2) "27"
3) "player1"
4) "40"

谢谢,我需要所有的玩家,而不仅仅是普通的那些...所以我使用了ZUNIONSTORE :) - Raj
@emaillenin,你的问题说“将共同玩家分组并总结他们的得分”,听起来像是交集,但只要你找到方法就行了...顺便提一下,如果集合很大,ZUNIONSTORE在CPU时间方面是一个相当昂贵的操作。 - Not_a_Golfer
我现在只有大约1000个用户,但我需要将5到6个集合进行UNION操作。当我们扩展规模时,是否有更好的替代方法? - Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接