*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"(顺序随机)