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