我将六个数据添加到排序集中。然后,我使用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
Run Code Online (Sandbox Code Playgroud)
预期结果:
kfc
mdl
apple
Run Code Online (Sandbox Code Playgroud)
实际结果:
0
Run Code Online (Sandbox Code Playgroud)
为什么呢?谢谢。
看起来您是在误解ZADD
并创建了比您想要的要多的集,或者您在应该使用并集时正在使用交集。让我们看一下两者:
一个潜在的问题是您要创建六个集合,而您可能想要创建两个集合。在设置符号中,您正在执行以下操作:
la.41 = {kfc}
la.42 = {mdl}
la.43 = {apple}
Run Code Online (Sandbox Code Playgroud)
相反,您可能想这样做:
la = {kfc, mdl, apple}
Run Code Online (Sandbox Code Playgroud)
如果这是您要执行的操作,则说明您误解了该ZADD
命令。
ZADD
需要一个键,一个分数和一个成员。您可以将键视为集合的名称,将成员视为要添加到集合中的事物,将分数视为成员在集合中的位置。
例如,如果我运行命令,ZADD foo 1 a
那么我创建了一个名为的集foo
,其成员a
的得分为1
。现在忽略分数,情况是这样的:
foo = {a}
Run Code Online (Sandbox Code Playgroud)
如果现在运行,ZADD foo 2 b
则将成员添加b
到现有集中foo
:
foo = {a, b}
Run Code Online (Sandbox Code Playgroud)
您在每个ZADD
命令中使用的键都不相同,因此您将在每个命令中创建一个新的键集。如果使用相同的密钥,因此使用相同的集合:
ZADD la 41 kfc
ZADD la 42 mdl
Run Code Online (Sandbox Code Playgroud)
您最终将创建一个集合:
la = {kfc, mdl}
Run Code Online (Sandbox Code Playgroud)
另一种选择是,您确实要创建六个集合,但是您想要并集而不是相交。
两个集合的并集是一个包含所有原始集合中存在的所有元素的集合:
{1, 2} ? {2, 3} = {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
两个集合的交集是一个包含两个原始集合中都存在的所有元素的集合:
{1, 2} ? {2, 3} = {2}
Run Code Online (Sandbox Code Playgroud)
您将创建六个没有公共元素的集合,然后取它们的交集:
{kfc} ? {mdl} ? {apple} ? {kfc} ? {mdl} ? {apple} = {}
Run Code Online (Sandbox Code Playgroud)
如果要使用并集,则最终将得到结果集中的所有元素:
{kfc} ? {mdl} ? {apple} ? {kfc} ? {mdl} ? {apple} = {kfc, mdl, apple}
Run Code Online (Sandbox Code Playgroud)
您可以使用ZUNIONSTORE
Redis命令代替来实现ZINTERSTORE
。