游乐游手机版
首页/数据库/文章详情

Redis Set 集合详解:底层原理、常用命令与实战示例

时间:2026-08-31 22:53
本文系统讲解 Redis Set 集合的核心特性与底层存储机制,涵盖 intset 与哈希表的切换条件、结构体定义及内存优化策略。通过完整命令汇总与终端交互示例,帮助开发者掌握集合操作、交集 并集 差集计算及实际应用场景。

Redis Set 是一种无序且元素唯一的字符串集合,底层通过 intset 或哈希表实现,具备 O(1) 时间复杂度的增删查能力。本文将拆解其存储结构切换逻辑、核心命令用法及典型业务场景,帮助你在抽奖去重、共同关注等需求中做出合理选型。

Set 集合核心特性与容量限制

Redis Set(集合)中的成员均为字符串类型,遵循无序排列且不可重复的规则。由于底层基于哈希映射表实现,其添加、删除和查找操作的时间复杂度均为 O(1)。单个集合最多可容纳 2^32 - 1 个成员(约 40 多亿个)。

当集合中最后一个成员被删除时,Redis 会自动回收该键对应的底层数据结构。集合的“自动去重”特性使其非常适合需要唯一性校验的场景,例如在抽奖系统中过滤已中奖用户 ID,防止重复中奖。

intset 底层结构与编码升级机制

Redis Set 采用两种底层存储结构:intset(整数集合)与 hash table(哈希表)。当满足以下两个条件时,Redis 会使用 intset 以节省内存:

  • 集合内所有成员均为整数值;
  • 集合内成员数量不超过 512 个。

一旦插入非整数或元素数量超过 512,Redis 会自动将底层结构升级为哈希表。

intset 的结构体定义如下:

typedef struct intset {    uint32_t encoding;  // 编码方式,默认为 INTSET_ENC_INT16    uint32_t length;    // 集合内成员总个数    int8_t contents[];  // 实际存储成员的数组,数值从小到大有序排列} intset;
  • encoding:指定编码格式,包含 INTSET_ENC_INT16、INTSET_ENC_INT32 和 INTSET_ENC_INT64 三种。Redis 会根据插入整数的实际大小动态选择编码,以最小化内存占用。当新插入的整数超出当前编码范围时,intset 会触发编码升级并重新分配内存。
  • length:记录 contents 数组中的成员总数。
  • contents:有序存储成员的数组,元素按从小到大排列且不允许重复。

intset 结构示意图如下:

集合intset数据结构

Set 常用命令速查表

Set 类型常用命令
命令说明
SADD key member [member ...]向集合添加一个或多个元素,自动去重
SCARD key返回集合中元素个数
SDIFF key1 [key2]返回两个或多个集合的差集
SDIFFSTORE destination key1 [key2]计算差集并将结果保存到指定集合
SINTER key1 [key2]返回两个或多个集合的交集
SINTERSTORE destination key1 [key2]计算交集并将结果保存到指定集合
SISMEMBER key member判断指定元素是否存在于集合中
SMEMBERS key返回集合中所有元素
SMOVE source destination member将元素从源集合移动到目标集合
SPOP key [count]随机弹出指定数量的元素
SRANDMEMBER key [count]随机返回指定数量的元素,默认返回 1 个
SREM key member [member ...]删除一个或多个元素,不存在的元素自动忽略
SUNION key1 [key2]返回两个或多个集合的并集
SUNIONSTORE destination key1 [key2]计算并集并将结果保存到指定集合
SSCAN key cursor [MATCH pattern] [COUNT count]迭代遍历集合中的元素

命令实战与业务场景演示

以“用户共同关注”场景为例,user:1 与 user:2 分别关注了不同的编程技术,通过 Set 命令可快速计算交集、并集并管理成员:

# 创建集合并添加多个成员127.0.0.1:6379> SADD user:1 python java mysql(integer) 3127.0.0.1:6379> SADD user:2 python c redis(integer) 3# 求交集:找出共同关注的技术127.0.0.1:6379> SINTER user:1 user:21) "python"# 求并集:合并所有关注的技术127.0.0.1:6379> SUNION user:1 user:21) "java"2) "python"3) "mysql"4) "redis"5) "c"# 查看集合所有成员127.0.0.1:6379> SMEMBERS user:11) "mysql"2) "java"3) "python"# 计算并集并保存到新集合 user:3127.0.0.1:6379> SUNIONSTORE user:3 user:1 user:2(integer) 5127.0.0.1:6379> SMEMBERS user:31) "java"2) "python"3) "mysql"4) "redis"5) "c"# 随机弹出元素127.0.0.1:6379> SPOP user:1 11) "python"127.0.0.1:6379> SPOP user:1 21) "mysql"2) "java"# 查看集合元素数量127.0.0.1:6379> SCARD user:2(integer) 3# 迭代遍历集合127.0.0.1:6379> SSCAN user:3 01) "0"2) 1) "mysql"   2) "redis"   3) "java"   4) "python"   5) "c"

如需在线验证命令效果,可访问 https://try.redis.io/;完整命令文档请参考 https://redis.io/commands

来源:https://m.biancheng.net/redis/sets.html
上一篇Redis连接命令详解:AUTH、PING、SELECT等命令使用指南 下一篇Redis Hash 哈希散列:底层原理、存储结构与常用命令详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis Hash 哈希散列:底层原理、存储结构与常用命令详解
数据库 · 2026-08-31

Redis Hash 哈希散列:底层原理、存储结构与常用命令详解

本文详解 Redis Hash 哈希散列的底层存储结构(ziplist 与 dict)、哈希冲突解决机制及常用命令操作。通过图解与实战示例,帮助开发者掌握 Hash 类型在对象存储场景中的高效应用与内存优化策略。

Redis连接命令详解:AUTH、PING、SELECT等命令使用指南
数据库 · 2026-08-31

Redis连接命令详解:AUTH、PING、SELECT等命令使用指南

本文详细解析Redis连接命令,包括AUTH、PING、SELECT、ECHO和QUIT等核心命令的语法、参数、返回值及常见错误处理。通过实操示例演示如何建立连接、验证密码、切换数据库及安全断开连接,帮助开发者快速掌握Redis客户端与服务端的交互机制。

Redis PubSub发布订阅模式详解:命令、流程与使用场景
数据库 · 2026-08-31

Redis PubSub发布订阅模式详解:命令、流程与使用场景

Redis PubSub(发布 订阅)是一种基于频道的消息多播机制,适用于实时通知与轻量级解耦场景。本文通过图解与终端交互示例,演示订阅、发布与接收的完整流程,汇总常用命令并说明模式匹配与状态查询方法,帮助开发者快速掌握其使用边界与注意事项。

Redis Stream消息队列:核心概念、命令与实战指南
数据库 · 2026-08-31

Redis Stream消息队列:核心概念、命令与实战指南

Redis 5 0引入的Stream数据类型提供了具备持久化与主从复制能力的消息队列功能。本文系统梳理Stream的核心架构、消息ID生成规则、消费组机制及ACK确认流程,并通过完整的CLI命令示例演示消息的发布、消费与状态管理,帮助开发者快速掌握Redis Stream的实战用法。