*Redis SINTERSTORE 命令
SINTERSTORE 计算多个 Set 的交集,并将结果保存到指定的目标键中。
*语法
SINTERSTORE destination key [key ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destination | String | 是 | 结果 Set 的键名,已存在则覆盖 |
| key | String | 是 | 一个或多个源 Set 键名,至少 1 个 |
*返回值
- Integer:结果 Set 中的成员数量(即交集成员数)
- 0:所有源 Set 无交集,或源 Set 全部不存在
*时间复杂度
O(N×M),最坏情况。N 为最小 Set 的基数,M 为 Set 的数量。
*示例
*基本用法
> SADD set1 a b c d
(integer) 4
> SADD set2 b c d e
(integer) 4
> SADD set3 c d e f
(integer) 4
> SINTERSTORE result set1 set2 set3
(integer) 2
> SMEMBERS result
1) "c"
2) "d"
*两个 Set 的交集
> SADD users:beijing alice bob charlie
(integer) 3
> SADD users:vip alice charlie dave
(integer) 3
> SINTERSTORE beijing_vip users:beijing users:vip
(integer) 2
> SMEMBERS beijing_vip
1) "alice"
2) "charlie"
*源 Set 不存在的情况
> SINTERSTORE result set1 notexist
(integer) 0
> EXISTS result
(integer) 1
> SMEMBERS result
(empty array)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 destination 或 key | 至少提供 destination 和 1 个 key |
| WRONGTYPE Operation against a key holding the wrong kind of value | 某个 key 不是 Set 类型 | 检查所有 key 的类型,确保为 Set |
*最佳实践
- 缓存交集结果:SINTERSTORE 比 SINTER 更适合大数据量场景,避免返回大数组阻塞网络
- 临时结果处理:destination 存入结果后,按需处理并删除,避免长期占用内存
- 多 Set 交集优化:交集运算的复杂度取决于最小 Set 的大小,优先让最小 Set 排在参数前面有助于内部优化
- 配合 SINTER:如果只需要查看交集而不保存,使用 SINTER;需要复用结果时用 SINTERSTORE
*FAQ
Q1: SINTERSTORE 会覆盖 destination 吗? A: 会。destination 已存在时会被覆盖为新的交集结果,类型变为 Set。
Q2: destination 可以是源 Set 之一吗? A: 可以。但结果会覆盖该 key,不影响交集计算的正确性。
Q3: 源 Set 中有不存在或空 Set 会怎样? A: 若任一源 Set 不存在或为空,交集为空,destination 被设为空 Set,返回 0。