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}
相关推荐
TDengine (老段)1 小时前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
Full Stack Developme2 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
m0_702036534 小时前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
qxwlcsdn4 小时前
如何用 IndexedDB 存储从 API 获取的超大列表并实现二级索引
jvm·数据库·python
phltxy4 小时前
Redis 主从复制
java·数据库·redis
2301_809244534 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
知识汲取者4 小时前
巨量引擎营销 API 完整文档
开发语言·数据库·python
shixiaoyu6665 小时前
Redis主从原理及哨兵搭建
redis
j7~6 小时前
【MYSQL】在Centos7和ubuntu22.04环境下安装
数据库·c++·mysql·ubuntu·centos