不完整的相交redis集

不完整的相交redis集,redis,Redis,我有一些数据要存储在redis中,以便能够有效地与之相交。示例数据: key | members --------------------------------- 101 | "a1", "a2", "a3" 102 | "a2", "a3" 103 | "a2", "a4" 所以,这些钥匙的交叉点会给我 SINTER 101 102 103 1) "a2" 但是,当数据集不完整时,我会遇到一些问题: key | members --------------------

我有一些数据要存储在redis中,以便能够有效地与之相交。示例数据:

 key |  members
---------------------------------
 101 |  "a1", "a2", "a3"
 102 |  "a2", "a3"
 103 |  "a2", "a4"
所以,这些钥匙的交叉点会给我

SINTER 101 102 103
1) "a2"
但是,当数据集不完整时,我会遇到一些问题:

 key |  members
---------------------------------
 101 |  "a1", "a2", "a3"
 102 |  "a2", "a3"
 103 |  "a4", "a5"
在这种情况下,获得相同三个关键点的交点将得到一个空集:

SINTER 101 102 103
(empty list or set)
我的目标是获得与大多数集合匹配的成员。redis中有没有实现这一点的方法?如果有帮助的话,我可以改变数据集的存储方式。即创建集合的反向版本(成员作为键,键作为成员)


此外,使用redis以外的其他密钥存储可能更有意义,因为它可能更适合此任务。

您可以使用AGGREGATE SUM参数对排序集执行并集操作。这有点笨重,但它能用。基本上,将分数为1的所有元素相加,然后将分数相加合并

结果集将从交点最多的图元排序到交点最少的图元:

127.0.0.1:6379> zadd foo 1 a
(integer) 1
127.0.0.1:6379> zadd foo 1 b
(integer) 1
127.0.0.1:6379> zadd foo 1 c
(integer) 1

127.0.0.1:6379> zadd bar 1 a
(integer) 1
127.0.0.1:6379> zadd bar 1 c
(integer) 1

127.0.0.1:6379> zadd baz 1 d
(integer) 1

# Now let's do the union and store it into "merged"
127.0.0.1:6379> ZUNIONSTORE merged 3 foo bar baz AGGREGATE SUM
(integer) 4

# Merged is now sorted by common points
127.0.0.1:6379> ZREVRANGE merged 0 -1 WITHSCORES
1) "c"
2) "2"
3) "a"
4) "2"
5) "d"
6) "1"
7) "b"
8) "1"
127.0.0.1:6379>

@Sævar请记住,如果你有很多大的场景,那么表现会很糟糕。它需要遍历每个集合中的每个元素。优雅的解决方案!还要注意以下情况:合并集合中所有项目的得分为
1
。如果集合
101
包含
a
b
,集合
102
包含
b
c
,集合
103
包含
c
d
,该怎么办?