ZDIFF
Introduction
In Dragonfly, as well as in Redis and Valkey, the ZDIFF
command is used to compute the difference between the members of multiple sorted sets.
This command is useful when you need to identify elements that belong to one sorted set, but not to others, and is helpful in scenarios like finding unique elements or filtering out overlap between sets.
Syntax
ZDIFF numkeys key [key ...] [WITHSCORES]
- Time complexity: O(L + (N-K)log(N)) worst case where L is the total number of elements in all the sets, N is the size of the first set, and K is the size of the result set.
- ACL categories: @read, @sortedset, @slow
Parameter Explanations
numkeys
: The number of input sorted sets.key
: The keys of the sorted sets to compare.WITHSCORES
(optional): If specified, the command returns both the members and their respective scores.
Return Values
- Without
WITHSCORES
: The command returns an array of members that are in the first sorted set but not in any of the other given sets. - With
WITHSCORES
: The command returns an array where each member is followed by its score.
Code Examples
Basic Example: Finding Differences Between Two Sets
Return the members found in the first sorted set but not in the second:
dragonfly$> ZADD myset1 1 "one" 2 "two" 3 "three"
(integer) 3
dragonfly$> ZADD myset2 2 "two" 4 "four"
(integer) 2
dragonfly$> ZDIFF 2 myset1 myset2
1) "one"
2) "three"
In this example, "one" and "three" are present in myset1
but not present in myset2
.
Example with WITHSCORES
Return both the members and their scores for the difference between two sets:
dragonfly$> ZADD myset1 1 "one" 2 "two" 3 "three"
(integer) 3
dragonfly$> ZADD myset2 2 "two" 4 "four"
(integer) 2
dragonfly$> ZDIFF 2 myset1 myset2 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
Here, "one" has a score of 1, and "three" has a score of 3.
Multiple Sets Difference Example
Find elements present in the first sorted set but missing in the other two sorted sets:
dragonfly$> ZADD myset1 1 "one" 2 "two" 3 "three" 4 "four"
(integer) 4
dragonfly$> ZADD myset2 3 "three" 4 "four"
(integer) 2
dragonfly$> ZADD myset3 1 "one" 5 "five"
(integer) 2
dragonfly$> ZDIFF 3 myset1 myset2 myset3
1) "two"
In this case, only "two" is present in myset1
but not in myset2
or myset3
.
Best Practices
- Use
ZDIFF
when you need to isolate unique elements in one sorted set compared to others. - Always ensure that the correct number of
numkeys
is provided to avoid errors or unwanted results. - If you're working with large sets, consider if you need
WITHSCORES
, as fetching scores increases the size of the returned data.
Common Mistakes
- Forgetting to specify the correct number of sorted sets in
numkeys
. The first argument should match the number of subsequent sorted set keys passed to the command. - Misunderstanding that
ZDIFF
by default only returns members and not their scores. UseWITHSCORES
if the scores are required as part of the result.
FAQs
What happens if a key does not exist?
If one or more of the keys do not exist, they are treated as empty sets, and the difference is calculated accordingly.
Can I use ZDIFF
with sets that are not sorted sets?
No, ZDIFF
only works with sorted sets. Passing keys of other types will result in an error.
What happens if I provide just one key?
If only one key is provided in the ZDIFF
command, it will simply return all the members of that sorted set, as there are no additional sets to subtract from it.