Redis set 命令怎么用?怎么高效处理海量数据和性能优化?实战案例有哪些?
Redis Set 命令主要用于处理无序且唯一的集合数据,常用命令包括 SADD 添加元素、SMEMBERS 获取所有成员、SISMEMBER 判断存在性、SREM 删除元素等。高效处理海量数据的关键在于避免使用阻塞主线程的 SMEMBERS 命令,生产环境建议改用 SSCAN 分批遍历,同时利用底层 intset 或 hashtable 编码特性优化内存。性能优化需注意大 Key 惰性释放及集合运算复杂度。实战案例广泛覆盖用户标签系统、社交关系(好友/关注)、抽奖去重、共同兴趣推荐及权限管理等场景,通过交集、并集、差集运算实现高效业务逻辑。
Redis 命令-Set 命令
Redis 命令-Set 命令 一、前言:Set 不是“集合”,而是高效工具箱 Redis 的 Set(集合) 是一个无序、唯一、基于哈希表的数据结构,天然支持去重和集合运算。典型应用场景包括:✅用户标签系统 (如“科技”、“金融”) ✅社交关系 (好友、关注、粉丝) ✅抽奖去重 (已中奖用户不再参与) ✅共同兴趣推荐 (交集计算) 本文将系统讲解 Redis Set 的核心命令,并通过真实业务案例展示其强大能力。二、Set 核心命令速查表
| 命令 | 作用 | 时间复杂度 |
|---|---|---|
| SADD key member [member ] | 添加一个或多个成员 | O(1) 每个成员 |
| SREM key member [member ] | 移除一个或多个成员 | O(1) 每个成员 |
| SMEMBERS key | 获取所有成员 | O(N),N=成员数 |
| SCARD key | 获取集合大小 | O(1) |
| SISMEMBER key member | 判断成员是否存在 | O(1) |
| SRANDMEMBER key [count] | 随机返回一个或多个成员 | O(N),N=count |
| SPOP key [count] | 随机弹出并移除成员 | O(N) |
| SMOVE source destination member | 将成员从一个集合移到另一个 | O(1) |
| 命令 | 作用 | 时间复杂度 |
|---|---|---|
| SINTER key [key ] | 求多个集合的 交集 | O(N×M),N=最小集合大小,M=集合数 |
| SUNION key [key ] | 求多个集合的 并集 | O(N+M+) |
| SDIFF key [key ] | 求第一个集合与其他集合的 差集 | O(N+M+) |
| SINTERSTORE dest key [key ] | 将交集结果存储到新集合 | 同 SINTER |
| SUNIONSTORE dest key [key ] | 将并集结果存储 | 同 SUNION |
| SDIFFSTORE dest key [key ] | 将差集结果存储 | 同 SDIFF |
Redis Set 深度解析:命令、业务场景与性能优化
Redis Set 深度解析:命令、业务场景与性能优化 一、Redis Set 基础命令与核心特性 1. 基础增删查命令 Redis Set 的核心特性是唯一性、无序性、快速访问。下面详细介绍每个基础命令的用法、原理和注意事项。
| 命令 | 作用与细节 |
|---|---|
| SADD key member [member ] | 向集合中添加一个或多个元素。唯一性保证重复元素不会被添加,返回实际新增的元素数量。示例:SADD tags "tech" "sports" |
| SMEMBERS key | 返回集合中所有元素,时间复杂度 O(N)。大集合会阻塞 Redis 主线程,生产环境建议用 SSCAN 分批遍历。 |
| SISMEMBER key member | 判断元素是否存在于集合中,时间复杂度 O(1)。适合频繁判断操作,例如用户标签检查。 |
| SCARD key | 返回集合元素数量,时间复杂度 O(1),读取元数据即可,无需遍历。 |
| SPOP key [count] | 随机移除并返回一个或多个元素。注意:Redis 内部随机是哈希表遍历顺序,并非完全均匀随机。示例:SPOP prizes 1 |
| SMOVE source destination member | 原子操作,将元素从 source 集合移动到 destination 集合。若 source 无该元素,返回 0;若 destination 已存在该元素,仅从 source 删除。 |
| SREM key member [member ] | 删除集合中一个或多个元素,返回实际删除数量。时间复杂度 O(1) 单元素。 |
[Redis 小技巧 3]Redis Set 类型深度解析:从底层原理到亿级标签系统实战-CSDN 博客
[Redis 小技巧 3]Redis Set 类型深度解析:从底层原理到亿级标签系统实战-CSDN 博客 在 Redis 的五大数据类型中,String 和 Hash 常被高频使用,而 Set(集合) 却因其“看似简单”而被低估。然而,在去重、关系建模、实时标签系统等场景中,Set 凭借其底层基于 intset(整数集合) 或 hashtable(哈希表) 的高效实现,展现出极强的工程价值。一、Set 的底层实现机制 Redis 的 Set 在内部根据元素类型和数量自动选择编码方式:
| 编码类型 | 触发条件 | 特点 |
|---|---|---|
| intset | 所有元素为整数,且元素数量 ≤ set-max-intset-entries (默认 512) | 内存紧凑,O(log N) 查找 |
| hashtable | 含非整数元素 或 元素数量 > 阈值 | O(1) 增删查,但内存开销较大 |
| 命令 | 功能 | 时间复杂度 | 典型用途 |
|---|---|---|---|
| SADD key member [member ] | 添加成员 | O(1) per member | 用户标签录入 |
| SMEMBERS key | 获取所有成员 | O(N) | 调试/全量导出 (慎用!) |
| SISMEMBER key member | 判断是否在集合中 | O(1) | 权限校验、存在性检查 |
| SREM key member [member ] | 移除成员 | O(1) per member | 标签取消 |
| SINTER key [key ] | 多集合交集 | O(N×M) | “同时拥有 A 和 B 标签”的用户 |
| SUNION key [key ] | 多集合并集 | O(N+M) | “拥有 A 或 B 标签”的用户 |
| SDIFF key [key ] | 差集 (即“在第一个中但不在其余中”) | O(N×M) | “有 A 但无 B"的用户 |
| SCARD key | 集合大小 | O(1) | 统计标签覆盖人数 |
| SSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代集合中的元素,避免一次性加载全部成员导致阻塞 | O(1) 每次调用 (但完整遍历为 O(N)) | 安全遍历大 Set(如导出用户标签、后台分析),替代 SMEMBERS 用于生产环境 |
Redis 数据结构:Set 类型全面解析
Redis 数据结构:Set 类型全面解析 Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。相对于列表,集合也有两个特点:无序、不可重复 一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,数学集合的概念是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。简而言之,Redis 集合就是一些不重复值的组合。利用集合 (Set) 这个数据结构,Redis 可以存储一些集合类型的数据,Redis 也通过一些简便的命令很好的支持了交集、并集和差集等集合的基本运算。1、Set 数据类型 1.1、Set 类型简介 Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。相对于列表,集合也有两个特点:无序、不可重复 一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,数学集合的概念是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。简而言之,Redis 集合就是一些不重复值的组合。利用集合 (Set) 这个数据结构,Redis 可以存储一些集合类型的数据,Redis 也通过一些简便的命令很好的支持了交集、并集和差集等集合的基本运算。1.2、Set 应用场景 常见的应用场景有:投票系统、标签系统、共同好友、共同关注、共同爱好、抽奖、商品筛选栏,访问 IP 统计等 使用场景:点赞、踩、收藏:Set 类型可以保证一个用户只能点一个赞; 共同关注、标签:Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等; 抽奖活动:存储某活动中中奖的用户名,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次 2、Set 底层结构 2.1、List 底层结构介绍 Redis Set 的底层存储采用 整数集合 IntSet 和哈希表,二者是相互转换的,使用 IntSet 存储必须满足下面两个条件,否则使用 HashTable,条件如下:结合对象保存的所有元素都是整数值; 集合对象保存的元素数量不超过 512 个 以 Set 的 SADD 命令为例子,整个添加过程如下:检查 Set 是否存在不存在则创建一个 Set 结合。根据传入的 Set 集合一个个进行添加,添加的时候需要进行内存压缩。setTypeAdd 执行 Set 添加过程中会判断是否进行编码转换 代码语言:javascript AI 代码解释 voidsaddCommand(redisClient*c){robj*set;int j,added=0;// 取出集合对象 set=lookupKeyWrite(c->db,c->argv[1]);// 对象不存在,创建一个新的,并将它关联到数据库 i
FAQ
Redis Set 适合存储什么类型的数据?
适合存储不允许重复的元素,例如用户标签、已读消息 ID、任务唯一标识等。
如何避免 SMEMBERS 命令阻塞 Redis 主线程?
在大集合上生产环境建议改用 SSCAN 分批获取,避免一次性加载全部成员导致阻塞。
Redis Set 的底层实现机制是什么?
Redis 的 Set 在内部根据元素类型和数量自动选择编码方式,包括 intset(整数集合) 和 hashtable(哈希表)。