redis zinterstore问题

时间:2012-05-25 05:24:18

标签: redis

我在分类集中添加了六个数据。然后我使用zinterstore来获得预期的结果。但结果为0。

zadd la.41 41 kfc
zadd la.42 42 mdl
zadd la.43 43 apple

zadd lo.77 77 apple
zadd lo.78 78 mdl
zadd lo.79 79 kfc

zinterstore close 6 la.41 la.42 la.43 lo.77 lo.78 lo.79

预期结果:

kfc
mdl
apple

实际结果:

0
为什么?感谢。

2 个答案:

答案 0 :(得分:5)

看起来您要么误解ZADD并创建比您意味着更多的集合,要么在您应该使用union时使用交集。让我们看看两者:

创建更少的集合

一个潜在的问题是你要创建六套,而你可能想要创建两套。在set notation中,您可以这样做:

la.41 = {kfc}
la.42 = {mdl}
la.43 = {apple}

相反,您可能希望这样做:

la = {kfc, mdl, apple}

如果这是您打算做的事情,那么您就误解了ZADD命令。

ZADD获得一把钥匙,一个分数和一名成员。您可以将密钥视为集合的名称,将成员视为您要添加到集合中的内容,将分数视为成员在集合中的位置。

例如,如果我运行命令ZADD foo 1 a,那么我创建了一个名为foo的集合,其成员a的分数为1。暂时忽略得分,情况就是这样:

foo = {a}

如果我现在运行ZADD foo 2 b,那么我已将成员b添加到现有集foo

foo = {a, b}

您在每个ZADD命令中使用了不同的键,因此您需要使用每个命令创建一个新组。如果您使用相同的密钥,因此使用相同的密钥:

ZADD la 41 kfc
ZADD la 42 mdl

您最终会创建一套:

la = {kfc, mdl}

联盟与交叉点

另一种选择是你想要创建六个集合,但你想要联合而不是交集。

两个集合的 union 是一个集合,其中包含任何一个原始集合中存在的所有元素:

{1, 2} ∪ {2, 3} = {1, 2, 3}

两个集合的交集是一个包含两个原始集合中存在的所有元素的集合:

{1, 2} ∩ {2, 3} = {2}

您正在创建六个集合,这些集合没有共同元素,然后将它们相交:

{kfc} ∩ {mdl} ∩ {apple} ∩ {kfc} ∩ {mdl} ∩ {apple} = {}

如果您正在使用联盟,那么最终会得到结果集中的所有元素:

{kfc} ∪ {mdl} ∪ {apple} ∪ {kfc} ∪ {mdl} ∪ {apple} = {kfc, mdl, apple}

您可以使用ZUNIONSTORE Redis命令代替ZINTERSTORE来实现此目的。

答案 1 :(得分:3)

我认为你并不真正了解排序集是什么。它是一组项目,每个项目都有一个分数,为数据结构提供顺序。对于每个项目,分数本身不是项目标识的一部分。

在这里,您构建了6个不同的有序集合,每个集合只有一个项目。某些已排序的集具有相同的项,但所有已排序的集中都不存在任何项。因此,正如预期的那样,这些集合的交集结果是空的。

顺便说一句,zinterstore命令的结果不是项目列表,而是结果的基数。您需要一个额外的命令来检索集合的内容。

示例:

> zinterstore close 2 la.41 lo.79
(integer) 1
> zrange close 0 -1
1) "kfc"