*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 不存在,不影响差集计算。