*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。