您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Redis中怎么实现Set集合
## 一、Redis Set集合概述
Set(集合)是Redis中的一种基本数据结构,它是一个无序且唯一的字符串集合。Redis Set通过哈希表实现,这使得添加、删除和查找操作的时间复杂度都是O(1)。
### 核心特性:
1. **唯一性**:自动去重,不允许重复成员
2. **无序性**:元素存储顺序与插入顺序无关
3. **高效操作**:支持交集、并集、差集等集合运算
## 二、底层实现原理
Redis Set的底层实现有两种方式,会根据元素数量和类型自动选择:
### 1. intset(整数集合)
当集合满足以下条件时使用:
- 所有元素都是整数
- 元素数量不超过`set-max-intset-entries`配置(默认512)
**数据结构**:
```c
typedef struct intset {
uint32_t encoding; // 编码方式(int16/int32/int64)
uint32_t length; // 元素个数
int8_t contents[]; // 柔性数组存储实际元素
} intset;
特点: - 内存连续分配,节省空间 - 元素有序存储(升序排列) - 二分查找时间复杂度O(logN)
当不满足intset条件时使用标准哈希表
实现特点: - 使用与Redis字典相同的结构 - value固定为NULL,仅使用key保证唯一性 - 平均时间复杂度O(1)
SADD key member [member ...] # 添加元素(返回新增元素数)
SCARD key # 获取元素数量
SMEMBERS key # 获取所有元素(小心大集合阻塞)
SISMEMBER key member # 检查元素是否存在
SREM key member [member ...] # 删除元素
SINTER key [key ...] # 交集
SUNION key [key ...] # 并集
SDIFF key [key ...] # 差集(第一个key独有的元素)
SINTERSTORE destination key [key ...] # 存储交集结果
SPOP key [count] # 随机移除并返回元素
SRANDMEMBER key [count] # 随机获取但不移除元素
# 给文章添加标签
SADD article:1:tags tech redis database
SADD article:2:tags programming redis
# 查找同时包含tech和redis的文章
SINTER tag:tech tag:redis
# 用户A的好友列表
SADD user:A:friends user:B user:C
# 共同好友计算
SINTER user:A:friends user:B:friends
# 记录UV(独立访客)
SADD daily_uv:20231001 user1 user2 user3
SCARD daily_uv:20231001
# 参与抽奖用户
SADD lottery:1001 user1 user2 user3
# 随机抽取3名中奖者
SRANDMEMBER lottery:1001 3
控制集合大小
SSCAN key cursor [MATCH pattern] [COUNT count]
合理选择编码
config set set-max-intset-entries 1024
集合运算注意事项
内存优化
结构类型 | 有序性 | 唯一性 | 适用场景 |
---|---|---|---|
Set | 无序 | 是 | 去重、集合运算 |
ZSet | 有序 | 是 | 排行榜、带权重集合 |
List | 有序 | 否 | 消息队列、时间线 |
Hash | 无序 | 字段唯一 | 对象属性存储 |
# 商品属性集合
SADD phones:brand apple huawei xiaomi
SADD phones:color black silver gold
SADD phones:price_range 1000-2000 2000-3000
# 筛选金色的小米手机
SINTER phones:brand:xiaomi phones:color:gold
# 使用管道批量操作
PIPELINE
SADD user:123:recent_viewed item456
EXPIRE user:123:recent_viewed 86400
EXEC
Q:Set和List的最大区别是什么? A:Set自动去重且无序,List保留插入顺序允许重复
Q:SMEMBERS和SSCAN如何选择? A:小集合用SMEMBERS,大集合(>1万元素)必须用SSCAN
Q:Set集合有长度限制吗? A:理论最大2^32-1个元素,但实际受内存限制
Q:如何实现集合元素过期? A:Redis原生不支持元素级过期,可通过以下方案实现: 1. 为每个元素创建带过期时间的String键 2. 使用ZSet通过分数控制过期
ZADD set_with_ttl <timestamp> member
ZREMRANGEBYSCORE set_with_ttl -inf <current_timestamp>
通过合理使用Redis Set集合,可以高效解决许多需要去重和集合运算的场景问题。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。