跟我学REDIS-REDIS(四)----常用数据类型之SET

本文详细介绍了Redis集合(Set)的功能和使用方法,包括基本操作如添加、删除成员,以及如何使用服务端命令实现集合间的并集、交集和差集运算。

Redis 集合(Set)是一个无序的字符串集合. 你可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在。 Redis 集合不允许包含相同成员的属性。多次添加相同的元素,最终在集合里只会有一个元素。 这就是意味着在添加元素的时候你无须检测元素是否存在。 

  Redis集合支持一些服务端的命令从现有的集合出发去进行集合运算,你可以在非常短的时间内进行合并(unions), 求交集(intersections),找出不同的元素(differences of sets)--差集。


SADD key member [member ...]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。

SMEMBERS key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合。



SISMEMBER key member
判断 member 元素是否集合 key 的成员。
如果 member 元素是集合的成员,返回 1 。
如果 member 元素不是集合的成员,或 key 不存在,返回 0 。



接下来说重点了,刚才说的那些集合操作怎么弄呢?


SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
不存在的 key 被视为空集。
返回值:
一个包含差集成员的列表。


SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的 key 被视为空集。

这个相对而言好理解,就是合集。


SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的 key 被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。



SRANDMEMBER key [count]
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。



<think>好的,用户让我详细讲解Redis。首先,我需要确定用户对Redis的了解程度。他可能是个开发者,或者刚开始学习后端技术。我需要从基础开始,确保他能跟上。 接下来,我应该考虑用户的需求。他可能想知道Redis是什么、为什么使用它,以及如何使用。可能的应用场景比如缓存、会话存储或者消息队列都是重点。 要分结构讲解。先介绍基本概念,然后特点,数据类型,持久化机制,高可用方案,应用场景,最后使用建议。这样逻辑清晰,用户容易理解。 需要注意Redis数据类型,比如String、Hash这些常用结构,还有持久化的RDB和AOF区别。用户可能对如何选择持久化方式有疑问,要解释清楚两者的优缺点。 高可用部分,主从复制、哨兵和集群的区别很重要。用户可能在生产环境中需要这些知识,所以要讲明白每种方案的适用场景。 应用场景部分,举实际例子,比如缓存雪崩的解决策略,这样用户能更好地理解如何应用Redis解决实际问题。 最后的使用建议,比如内存管理、避免大Key,这些是实际开发中的常见问题,用户可能会遇到,提前给出建议会有帮助。 需要检查技术术语是否有必要解释,比如“内存数据库”、“持久化”等,确保用户没有障碍。同时,保持语言简洁,避免冗长,重点突出。 可能用户需要实际操作示例,但问题中没有要求,所以暂时不深入代码,保持概述性质。如果有后续问题,可以再详细展开。 总结下来,结构大致分为七个部分,每个部分简明扼要,涵盖核心知识点,帮助用户全面了解Redis。</think>以下是对Redis的详细讲解,采用结构化方式呈现: ### **一、Redis基本概念** Redis(Remote Dictionary Server)是开源的**内存键值数据库**,由Salvatore Sanfilippo于2009年开发。采用C语言编写,支持网络交互,提供多种数据结构的持久化存储,单线程架构设计保障原子性操作。 **二、核心特点** 1. **高性能** - 内存操作响应时间<1ms - 单机QPS可达10万+(简单命令) 2. **数据结构丰富** - 支持String、Hash、List、Set、ZSet、Bitmaps等 3. **持久化机制** - RDB快照(二进制压缩存储) - AOF日志(记录写操作) 4. **高可用方案** - 主从复制 - Redis Sentinel(哨兵) - Redis Cluster(分片集群) 5. **扩展功能** - Lua脚本、事务、发布订阅、Stream消息队列 **三、数据结构详解** | 类型 | 特征 | 典型场景 | |-----------|-------------------------------|---------------------------| | String | 最大512MB,可存文本/二进制 | 缓存、计数器 | | Hash | 字段值映射表 | 对象属性存储 | | List | 双向链表,支持阻塞操作 | 消息队列、最新消息排行 | | Set | 无序唯一集合 | 共同关注、抽奖 | | ZSet | 带权重的有序集合 | 排行榜、延迟队列 | | HyperLogLog | 基数统计(误差0.81%) | UV统计 | **、持久化机制对比** ```markdown | 特性 | RDB | AOF | |-------------|------------------------------|------------------------------| | 存储方式 | 时间点快照 | 追加操作日志 | | 文件大小 | 较小(二进制压缩) | 较大(文本命令) | | 恢复速度 | 快 | 慢 | | 数据安全 | 可能丢失最后一次保存后的数据 | 可配置同步频率(默认每秒) | | 适用场景 | 灾备恢复 | 高数据持久性要求 | ``` **五、高可用方案演进** 1. **主从复制** - 一主多从架构,异步数据同步 - 故障需手动切换 2. **Redis Sentinel** - 监控+自动故障转移 - 实现HA,但需客户端支持 3. **Redis Cluster** - 数据分片(16384 slots) - 自动重分片,节点间Gossip协议通信 **六、典型应用场景** 1. **缓存加速** - 缓存穿透:布隆过滤器 - 缓存雪崩:随机过期时间 - 缓存击穿:互斥锁 2. **会话存储** - 分布式Session管理 3. **实时排行榜** - ZSET实现分数排序 4. **分布式锁** - SETNX命令+过期时间 5. **消息队列** - Stream数据类型支持消费者组 **七、使用建议** 1. 内存规划不超过物理内存70% 2. 避免大Key(单个Value>1MB) 3. 生产环境推荐Cluster模式 4. 监控慢查询(`slowlog get`) 5. AOF重写期间预留足够磁盘空间 **学习路径建议**: 1. 掌握基础命令 → 2. 理解持久化机制 → 3. 部署集群 → 4. 研究源码(如事件循环ae.c) 是否需要针对某个技术点(如Redis事务、内存淘汰策略等)进行深入说明?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值