In Redis, the ZDIFF
command returns the difference between the first and all successive input sorted sets.
There’s also a ZDIFFSTORE
command that stores the result in a key.
Syntax
The syntax for ZDIFF
goes like this:
ZDIFF numkeys key [key ...] [WITHSCORES]
Example
Suppose we create two sorted sets, like this:
ZADD cats 1 meow 2 fluffy 3 scratch
And:
ZADD dogs 1 bark 2 woof
We can use the ZDIFF
command against those two sorted sets like this:
ZDIFF 2 cats dogs
Result:
1) "meow" 2) "fluffy" 3) "scratch"
That returns all the elements in the first set that aren’t in the second set. By this, I mean all elements whose values aren’t in the second set.
Let’s add an element to the dogs
set:
ZADD dogs 3 fluffy
Now let’s run ZDIFF
again:
ZDIFF 2 cats dogs
Result:
1) "meow" 2) "scratch"
This time only two elements are returned. That’s because fluffy
appears in both sorted sets and ZDIFF
only returns the difference between the first sorted set and all subsequent sorted sets.
The numkeys
value of 2
in the above examples means that I’m providing two sets.
More Sorted Sets
The ZDIFF
command allows us to include as many sorted sets as we want in our list. They are all compared to the first one and any difference between the first and subsequent sets are returned.
Let’s create another sorted set:
ZADD birds 1 tweet 2 scratch
Now let’s run ZDIFF
against all three sets:
ZDIFF 3 cats dogs birds
Result:
1) "meow"
This time only one element is returned. That’s because the other elements from the cats
set contain values that are also present in at least one of the other sorted sets. That is, the dogs
set contains fluffy
and the birds
set contains scratch
, both of which are in the cats
set.
Note that the numkeys
argument is now 3
, which reflects the number of sorted sets I’m providing.
The WITHSCORES
Argument
The WITHSCORES
argument can be used to output the scores of each element returned:
ZDIFF 2 cats dogs WITHSCORES
Result:
1) "meow" 2) "1" 3) "scratch" 4) "3"
Non-Existent Keys
Keys that don’t exist are treated as empty sets:
ZDIFF 2 oops1 oops2
Result:
(empty array)
Here we got an empty array because none of the keys exist.
Here’s what happens when the first key exists, but none of the others do:
ZDIFF 3 cats oops1 oops2
Result:
1) "meow" 2) "fluffy" 3) "scratch"
All elements from the first set are returned because none of them are present in any of the other (empty) sets.
Using the Wrong numkeys
Argument
Here’s what happens when we use the wrong value for the numkeys
argument:
ZDIFF 3 cats dogs
Result:
(error) ERR syntax error
In this case I specified that there would be three sorted sets to compare, but I only provided two.
The same error applies when it’s the other way around (i.e. I specify 2
but provide three keys):
ZDIFF 2 cats dogs birds
Result:
(error) ERR syntax error
Passing a Key of the Wrong Type
Here’s what happens when we pass a key that contains a different type (i.e. it’s not a sorted set):
ZDIFF 2 cats country
Result:
(error) WRONGTYPE Operation against a key holding the wrong kind of value
Here the country
key contains a string.
However, the command does work on non-sorted sets:
ZDIFF 2 countries cats
Result:
1) "Australia" 2) "New Zealand"
In this case the countries
key contains a (non-sorted) set.