相交的redis集不完整

时间:2017-09-12 14:05:27

标签: redis

我想要在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之外的其他密钥存储区可能更有意义,这可能更适合此任务吗?

1 个答案:

答案 0 :(得分:2)

您可以使用AGGREGATE SUM参数对有序集合上的Union运算执行此操作。它有点笨重但它会起作用。基本上添加得分为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>