*Redis SDIFF 命令

SDIFF 返回第一个 Set 与其他所有 Set 的差集,即只在第一个 Set 中存在、而不在其他 Set 中存在的成员。


*语法

SDIFF key [key ...]

*参数说明

参数 类型 必填 说明
key String 第一个 Set 键名(被减数)
key String 后续 Set 键名(减数),可多个

*返回值

  • Array:差集成员列表(不保证顺序)
  • 空数组:无差集或 key 不存在

*时间复杂度

O(N),N 为所有参与运算的 Set 成员总数


*示例

*两个 Set 差集

> SADD set1 a b c d
(integer) 4
> SADD set2 b c
(integer) 2
> SDIFF set1 set2
1) "a"
2) "d"

*多个 Set 差集

> SADD set3 c d
(integer) 2
> SDIFF set1 set2 set3
1) "a"

*key 不存在

> SDIFF nonexist set1
(empty array)

*常见错误

错误 原因 解决
WRONGTYPE Operation against a key holding the wrong kind of value key 不是 Set 类型 检查 key 的数据类型
ERR wrong number of arguments 未提供 key 至少提供一个 Set 键名

*最佳实践

  • 标签/好友差集:用户 A 的 Set 减去用户 B 的 Set,找出 A 有但 B 没有的标签
  • 黑白名单过滤:全部用户 Set 减去黑名单 Set,得到白名单
  • 差集顺序重要:SDIFF A B 是 A-B(在 A 但不在 B);SDIFF B A 是 B-A
  • 大数据量时用 SDIFFSTORE 将结果保存到目标 key,避免网络传输大数组

*FAQ

Q1: SDIFF 的顺序重要吗? A: 重要。SDIFF 以第一个 Set 为基准减去后续所有 Set。SDIFF A B 是 A-B;SDIFF B A 是 B-A,结果通常不同。

Q2: SDIFF 和 SDIFFSTORE 有什么区别? A: SDIFF 仅返回差集结果;SDIFFSTORE 将结果保存到指定 destination key 中,适合后续复用。

Q3: 如果某个 key 不存在会怎样? A: 不存在的 key 被视为空 Set。若第一个 key 不存在,返回空数组;若后续 key 不存在,不影响差集计算。