2

我将六个数据添加到排序集中。然后我使用 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

为什么 ?谢谢。

4

2 回答 2

5

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

创建更少的集合

一个潜在的问题是您正在创建六个集合,而您可能想要创建两个集合。在集合表示法中,您正在执行以下操作:

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}

联合与交叉

另一种方法是您确实想要创建六个集合,但您想要并集而不是交集。

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

{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}

您可以通过使用ZUNIONSTORERedis 命令而不是ZINTERSTORE.

于 2012-05-25T06:32:51.657 回答
3

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

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

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

例子:

> zinterstore close 2 la.41 lo.79
(integer) 1
> zrange close 0 -1
1) "kfc"
于 2012-05-25T06:03:58.630 回答