*Redis SDIFF 命令 返回多个集合的差集
*语法
SDIFF key [key ...]
*说明
返回给定的多个 Set 集合之间的差集(difference set)。
数学定义:差集 = 第一个集合中存在的成员,但在后续所有集合中都不存在的成员。
例如,给定集合 A 和 B,SDIFF A B 的结果是所有属于 A 但不属于 B 的成员。
如果 key 不存在,Redis 将其视为一个空的 Set 集合。例如:
SDIFF A B,如果 A 不存在,则结果为空集合。SDIFF A B,如果 B 不存在,则结果为 A 的全部成员(因为空集与任何集合的差集都是原集合)。
重要提示:SDIFF 返回的结果是无序的(unspecified order),因为 Set 本身就是无序集合,差集运算不保证成员的输出顺序。
*返回值
- Array:差集成员的列表(无序)。如果结果为空,则返回空数组。
*时间复杂度
- O(N),其中
N是所有参与运算的集合的成员总数。
*版本兼容性
| Redis 版本 | 变更说明 |
|---|---|
| >= 1.0.0 | 初始支持 |
*示例
*示例 1:两个集合的差集
# 创建集合 A
SADD set_a "a" "b" "c" "d"
# 返回:(integer) 4
# 创建集合 B
SADD set_b "b" "c" "e" "f"
# 返回:(integer) 4
# A - B:属于 A 但不属于 B 的成员
SDIFF set_a set_b
# 返回:1) "a" 2) "d"(顺序随机)
# B - A:属于 B 但不属于 A 的成员
SDIFF set_b set_a
# 返回:1) "e" 2) "f"(顺序随机)
*示例 2:多个集合的差集
# 创建三个集合
SADD group1 "alice" "bob" "charlie" "dave"
# 返回:(integer) 4
SADD group2 "bob" "charlie"
# 返回:(integer) 2
SADD group3 "alice"
# 返回:(integer) 1
# group1 - group2 - group3:在 group1 中但不在 group2 也不在 group3 中的成员
SDIFF group1 group2 group3
# 返回:1) "dave"(顺序随机)
*示例 3:空集合与差集运算
# 集合 A 存在,B 不存在
SADD set_x "one" "two" "three"
# 返回:(integer) 3
# B 不存在,视为空集,差集 = A
SDIFF set_x non_existent_set
# 返回:1) "one" 2) "two" 3) "three"(顺序随机)
# A 不存在,差集为空
SDIFF non_existent_set set_x
# 返回:(empty array)
*示例 4:实际应用场景——找出"未完成任务"的用户
# 所有注册的用户
SADD all_users "u100" "u101" "u102" "u103" "u104"
# 返回:(integer) 5
# 已完成任务的用户
SADD completed_users "u101" "u103"
# 返回:(integer) 2
# 未完成任务的 = 所有用户 - 已完成用户
SDIFF all_users completed_users
# 返回:1) "u100" 2) "u102" 3) "u104"(顺序随机)