*Redis SINTER 命令 返回多个集合的交集

*语法

SINTER key [key ...]
SINTER key [key ...] [LIMIT count]

*说明

返回给定的多个 Set 集合之间的交集(intersection set)。

数学定义:交集 = 同时存在于所有给定集合中的成员。

如果 key 不存在,Redis 将其视为一个空的 Set 集合。因此,只要参与运算的任一集合为空或不存在,交集结果必然为空。

重要提示:SINTER 返回的结果是无序的(unspecified order),因为 Set 本身是无序集合,交集运算不保证成员的输出顺序。

*Redis 7.0 新特性:LIMIT 选项

Redis 7.0 开始,SINTER 支持可选的 LIMIT 选项,用于限制返回的交集成员数量。

  • SINTER key1 key2 ... keyN LIMIT count
  • 当指定 LIMIT 时,命令在找到 count 个交集成员后就会停止扫描,从而节省计算资源。
  • 这在处理大规模集合且只需要少量样本时非常有用。
  • 如果没有指定 LIMIT,则返回完整的交集。

*返回值

  • Array:交集成员的列表(无序)。如果结果为空,则返回空数组。

*时间复杂度

  • O(N×M),其中 N 是最小集合的成员数量,M 是参与运算的集合数量。
  • 当使用 LIMIT 选项时,复杂度可以降低,因为可以在达到限制时提前终止。

*版本兼容性

Redis 版本 变更说明
>= 1.0.0 初始支持
>= 7.0.0 支持 LIMIT count 选项

*示例

*示例 1:两个集合的交集

# 创建集合 A
SADD set_a "a" "b" "c" "d"
# 返回:(integer) 4

# 创建集合 B
SADD set_b "b" "c" "e" "f"
# 返回:(integer) 4

# A 和 B 的交集
SINTER set_a set_b
# 返回:1) "b"  2) "c"(顺序随机)

*示例 2:多个集合的交集

SADD group1 "alice" "bob" "charlie"
# 返回:(integer) 3

SADD group2 "bob" "charlie" "dave"
# 返回:(integer) 3

SADD group3 "charlie" "eve"
# 返回:(integer) 2

# 同时存在于三个集合中的成员
SINTER group1 group2 group3
# 返回:1) "charlie"(顺序随机)

*示例 3:任一集合为空时交集为空

SADD set_x "one" "two"
# 返回:(integer) 2

# set_y 不存在,视为空集
SINTER set_x set_y
# 返回:(empty array)

# 多个集合中有一个不存在
SADD set_z "two"
# 返回:(integer) 1

SINTER set_x set_y set_z
# 返回:(empty array)

*示例 4:使用 LIMIT 选项(Redis 7.0+)

# 创建两个较大的集合
SADD big_a "a1" "a2" "a3" "a4" "a5"
# 返回:(integer) 5

SADD big_b "a1" "a2" "a3" "a6" "a7"
# 返回:(integer) 5

# 完整交集
SINTER big_a big_b
# 返回:1) "a1"  2) "a2"  3) "a3"(顺序随机)

# 只返回最多 2 个交集成员(Redis 7.0+)
SINTER big_a big_b LIMIT 2
# 返回:最多 2 个成员(顺序随机)

*示例 5:实际应用场景——共同好友/共同标签

# Alice 的好友
SADD friends:alice "bob" "charlie" "dave" "eve"
# 返回:(integer) 4

# Bob 的好友
SADD friends:bob "alice" "charlie" "dave" "frank"
# 返回:(integer) 4

# Alice 和 Bob 的共同好友
SINTER friends:alice friends:bob
# 返回:1) "charlie"  2) "dave"(顺序随机)