Redis 的 Set(集合) 是无序、去重 的字符串集合,核心价值就是高效的集合运算,常用于交集、并集、差集、去重统计等场景。
我会把 Redis 集合的基础命令、四大核心运算、实战用法一次性讲全,你可以直接照着用。
一、先掌握:集合基础命令
先学会增删查,才能做运算:
bash
运行
# 向集合添加元素(自动去重)
SADD key1 a b c d
SADD key2 c d e f
# 查看集合所有元素
SMEMBERS key1 # 返回 a b c d
SMEMBERS key2 # 返回 c d e f
# 查看集合元素个数
SCARD key1 # 返回 4
# 判断元素是否在集合中
SISMEMBER key1 a # 返回 1(存在)
二、核心:Redis 四大集合运算(重点)
这是工作中最常用的 交集、并集、差集、对称差集 ,分为直接返回结果 和保存结果到新集合两种用法。
1. 交集(INTERSECT)
定义 :多个集合都共同拥有 的元素场景:共同好友、共同关注、共同标签
bash
运行
# 1. 直接返回交集结果(不存储)
SINTER key1 key2
# 结果:c d
# 2. 计算并保存交集到新集合 dest_key
SINTERSTORE dest_key key1 key2
SMEMBERS dest_key # c d
2. 并集(UNION)
定义 :所有集合的元素合并去重 场景:全部粉丝、全量标签、合并数据
bash
运行
# 1. 直接返回并集结果
SUNION key1 key2
# 结果:a b c d e f
# 2. 保存并集到新集合
SUNIONSTORE dest_key key1 key2
3. 差集(DIFF)
定义 :第一个集合 有,但其他集合没有 的元素顺序非常重要!
bash
运行
# key1 - key2:key1 有、key2 没有的元素
SDIFF key1 key2
# 结果:a b
# key2 - key1:key2 有、key1 没有的元素
SDIFF key2 key1
# 结果:e f
# 保存差集
SDIFFSTORE dest_key key1 key2
4. 对称差集
定义 :只在其中一个集合 出现,不同时存在于两个集合的元素公式:并集 - 交集
bash
运行
# Redis 6.2+ 支持
SDIFF key1 key2 # 等效对称差集
# 结果:a b e f
三、运算命令速查表(直接收藏)
表格
| 运算 | 命令(返回结果) | 命令(保存结果) | 说明 |
|---|---|---|---|
| 交集 | SINTER | SINTERSTORE | 共同元素 |
| 并集 | SUNION | SUNIONSTORE | 合并去重 |
| 差集 | SDIFF | SDIFFSTORE | 第一个集合独有 |
四、超实用业务场景
-
共同好友
bash
运行
SADD user:1:friends 张三 李四 王五 SADD user:2:friends 李四 王五 赵六 SINTER user:1:friends user:2:friends # 共同好友:李四 王五 -
可能认识的人(差集)
bash
运行
SDIFF user:1:friends user:2:friends # user1 有、user2 没有的好友 → 推荐给 user2 -
统计在线用户(去重) 用集合存在线用户 ID,自动去重,
SCARD直接查在线人数。 -
黑名单 / 白名单过滤用差集快速过滤出合法用户。
五、重要特性
- 自动去重:重复元素添加无效
- 无序:不保证元素顺序
- 高效:集合运算时间复杂度低,适合大数据量
- 原子性:所有命令都是原子操作,并发安全
总结
- Redis 集合核心就是 交、并、差 三大运算
- SINTER/SUNION/SDIFF 直接返回结果
- 带 STORE 的命令 可以把结果存起来,避免重复计算
- 最常用场景:共同好友、去重统计、数据过滤、推荐系统
需要我给你写一套 可直接运行的完整测试代码(包含所有运算)吗?
需要
Redis 集合运算完整测试脚本
一、Redis 命令行实操(直接复制执行)
redis
# 1. 初始化两个测试集合
SADD set1 a b c d
SADD set2 c d e f
# 查看集合元素
SMEMBERS set1
SMEMBERS set2
# 2. 交集运算
SINTER set1 set2
SINTERSTORE inter_res set1 set2
SMEMBERS inter_res
# 3. 并集运算
SUNION set1 set2
SUNIONSTORE union_res set1 set2
SMEMBERS union_res
# 4. 差集运算
SDIFF set1 set2
SDIFF set2 set1
SDIFFSTORE diff_res set1 set2
SMEMBERS diff_res
# 5. 对称差集
SDIFF SUNION set1 set2 SINTER set1 set2
# 6. 辅助常用命令
SCARD set1 # 统计元素数量
SISMEMBER set1 a # 判断元素是否存在
SPOP set1 # 随机弹出元素
SRANDMEMBER set2 # 随机获取元素
# 清空测试数据
DEL set1 set2 inter_res union_res diff_res
二、Java Jedis 代码实现
java
运行
import redis.clients.jedis.Jedis;
import java.util.Set;
public class RedisSetOperate {
public static void main(String[] args) {
// 连接Redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 1.添加集合数据
jedis.sadd("set1", "a", "b", "c", "d");
jedis.sadd("set2", "c", "d", "e", "f");
// 2.交集
Set<String> intersect = jedis.sinter("set1", "set2");
System.out.println("交集:" + intersect);
jedis.sinterstore("inter_res", "set1", "set2");
// 3.并集
Set<String> union = jedis.sunion("set1", "set2");
System.out.println("并集:" + union);
jedis.sunionstore("union_res", "set1", "set2");
// 4.差集
Set<String> diff1 = jedis.sdiff("set1", "set2");
System.out.println("set1-set2差集:" + diff1);
Set<String> diff2 = jedis.sdiff("set2", "set1");
System.out.println("set2-set1差集:" + diff2);
jedis.sdiffstore("diff_res", "set1", "set2");
// 释放连接
jedis.close();
}
}
三、Python redis-py 实现
python
运行
import redis
# 连接
r = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)
# 存入数据
r.sadd("set1", "a", "b", "c", "d")
r.sadd("set2", "c", "d", "e", "f")
# 交集
print("交集", r.sinter("set1", "set2"))
r.sinterstore("inter_res", "set1", "set2")
# 并集
print("并集", r.sunion("set1", "set2"))
r.sunionstore("union_res", "set1", "set2")
# 差集
print("set1差集", r.sdiff("set1", "set2"))
print("set2差集", r.sdiff("set2", "set1"))
r.sdiffstore("diff_res", "set1", "set2")
# 清空
r.delete("set1", "set2", "inter_res", "union_res", "diff_res")
四、运行结果
- 交集:
{c,d} - 并集:
{a,b,c,d,e,f} - set1-set2 差集:
{a,b} - set2-set1 差集:
{e,f}