Redis 集合(Set)运算完全指南

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 第一个集合独有

四、超实用业务场景

  1. 共同好友

    bash

    运行

    复制代码
    SADD user:1:friends 张三 李四 王五
    SADD user:2:friends 李四 王五 赵六
    SINTER user:1:friends user:2:friends
    # 共同好友:李四 王五
  2. 可能认识的人(差集)

    bash

    运行

    复制代码
    SDIFF user:1:friends user:2:friends
    # user1 有、user2 没有的好友 → 推荐给 user2
  3. 统计在线用户(去重) 用集合存在线用户 ID,自动去重,SCARD 直接查在线人数。

  4. 黑名单 / 白名单过滤用差集快速过滤出合法用户。


五、重要特性

  1. 自动去重:重复元素添加无效
  2. 无序:不保证元素顺序
  3. 高效:集合运算时间复杂度低,适合大数据量
  4. 原子性:所有命令都是原子操作,并发安全

总结

  1. Redis 集合核心就是 交、并、差 三大运算
  2. SINTER/SUNION/SDIFF 直接返回结果
  3. 带 STORE 的命令 可以把结果存起来,避免重复计算
  4. 最常用场景:共同好友、去重统计、数据过滤、推荐系统

需要我给你写一套 可直接运行的完整测试代码(包含所有运算)吗?

需要

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}
相关推荐
吃糖的小孩1 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3502 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3502 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3502 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
leeyi2 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
SelectDB3 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶3 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵3 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils3 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库