看起来您要么误解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}
您可以通过使用ZUNIONSTORE
Redis 命令而不是ZINTERSTORE
.