在 Redis 中,SINTER
命令用于计算多个 Set(集合)的交集,并返回所有集合中都存在的成员。
1. SINTER
基本语法
SINTER key1 [key2 ...]
- 参数:可以传入多个 Set 的
key
(至少一个)。 - 返回值:返回所有给定 Set 的交集(共同存在的元素)。
2. 示例
(1) 准备测试数据
127.0.0.1:6379> SADD set1 "A" "B" "C"
(integer) 3
127.0.0.1:6379> SADD set2 "B" "C" "D"
(integer) 3
127.0.0.1:6379> SADD set3 "C" "D" "E"
(integer) 3
(2) 计算交集
① set1
∩ set2
127.0.0.1:6379> SINTER set1 set2
1) "B"
2) "C"
② set1
∩ set2
∩ set3
127.0.0.1:6379> SINTER set1 set2 set3
1) "C"
3. SINTERSTORE
(存储结果到新 Set)
如果不想直接返回结果,而是存到一个新的 Set,可以使用:
SINTERSTORE destination_key key1 [key2 ...]
示例
127.0.0.1:6379> SINTERSTORE result_set set1 set2 set3
(integer) 1 #表示存储了 1 个元素到 result_set
127.0.0.1:6379> SMEMBERS result_set
1) "C" #查看存储的结果
4. 编程语言示例
(Python - redis-py)
import redis
r = redis.Redis()
#添加测试数据
r.sadd("set_a", "a", "b", "c")
r.sadd("set_b", "b", "c", "d")
#计算交集并返回结果列表 ["b", "c"]
intersection = r.sinter("set_a", "set_b")
print(intersection)
#存储交集到新Key:"result_set"
r.sinterstore("result_set", ["set_a", "set_b"])
print(r.smembers("result_set")) # {"b", c"}
(Java - Jedis)
import redis.clients.jedis.Jedis;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.sadd("group_tech", "{user100}", "{user101}");
jedis.sadd("group_devs", "{user100}", "{user102}");
//获取交集 [{user100}]
Set<String> commonUsers = jedis.sinter("group_tech", "group_devs");
System.out.println(commonUsers);
//存储交集到新Key:"common_group"
jedis.sinterstore("common_group","group_tech","group_devs");
}
}
5. ⚠️ 注意事项 &优化建议
场景 | 解决方案 |
---|---|
大 Key(百万级成员) | 改用 SSCAN + client-side merge ,避免阻塞 Redis |
需要高性能查询 | 提前用 SINTERSTORE 缓存结果 |
空集合时 | 返回空数组 |
如果需要更详细的性能优化或分布式方案探讨,欢迎继续交流! 🚀
内容由零声教学AI助手提供,问题来源于学员提问