*Redis SDIFFSTORE 命令
SDIFFSTORE 计算第一个 Set 与其他 Set 的差集,并将结果保存到 destination key 中。
*语法
SDIFFSTORE destination key [key ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destination | String | 是 | 保存差集结果的目标键名 |
| key | String | 是 | 第一个 Set 键名(被减数) |
| key | String | 否 | 后续 Set 键名(减数),可多个 |
*返回值
- Integer:结果 Set 的成员数量
*时间复杂度
O(N),N 为所有参与运算的 Set 成员总数
*示例
*基本用法
> SADD set1 a b c d
(integer) 4
> SADD set2 b c
(integer) 2
> SDIFFSTORE result set1 set2
(integer) 2
> SMEMBERS result
1) "a"
2) "d"
*多个 Set 差集存储
> SADD set3 c d
(integer) 2
> SDIFFSTORE result2 set1 set2 set3
(integer) 1
> SMEMBERS result2
1) "a"
*覆盖已有 destination
> SET oldkey "string"
OK
> SDIFFSTORE oldkey set1 set2
(integer) 2
> TYPE oldkey
set
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | 源 key 不是 Set 类型 | 检查源 key 的数据类型 |
| ERR wrong number of arguments | 缺少 destination 或 key | 确保至少提供 destination 和一个源 key |
*最佳实践
- 避免重复计算:大数据量差集结果需要多次使用时,用 SDIFFSTORE 保存到 key 中复用
- 覆盖注意:destination 若已存在会被覆盖(任何类型都会被替换为 Set)
- 性能优化:当差集结果很大时,SDIFFSTORE 避免了一次性网络传输大量数据
- 定时任务:定期用 SDIFFSTORE 计算差集缓存,如黑名单过滤结果
*FAQ
Q1: SDIFFSTORE 和 SDIFF 有什么区别? A: SDIFF 仅返回差集数组;SDIFFSTORE 将结果保存到 destination key 并返回成员数量,便于后续操作。
Q2: destination 已存在会怎样? A: 无论 destination 之前是什么类型或有什么数据,都会被覆盖为新的差集 Set。
Q3: 结果为空时 destination 会怎样? A: 差集为空时,destination key 会被删除(如果存在),返回 0。