*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"(顺序随机)