redis中怎么实现set集合

发布时间:2021-08-05 16:22:57 作者:Leah
来源:亿速云 阅读:263
# 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)

2. hashtable(哈希表)

当不满足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]       # 随机获取但不移除元素

四、典型应用场景

1. 标签系统

# 给文章添加标签
SADD article:1:tags tech redis database
SADD article:2:tags programming redis

# 查找同时包含tech和redis的文章
SINTER tag:tech tag:redis

2. 好友关系

# 用户A的好友列表
SADD user:A:friends user:B user:C

# 共同好友计算
SINTER user:A:friends user:B:friends

3. 唯一计数器

# 记录UV(独立访客)
SADD daily_uv:20231001 user1 user2 user3
SCARD daily_uv:20231001

4. 抽奖系统

# 参与抽奖用户
SADD lottery:1001 user1 user2 user3

# 随机抽取3名中奖者
SRANDMEMBER lottery:1001 3

五、性能优化建议

  1. 控制集合大小

    • 大集合(>1万元素)慎用SMEMBERS,推荐SSCAN分批获取
    SSCAN key cursor [MATCH pattern] [COUNT count]
    
  2. 合理选择编码

    • 对于纯数字集合,保持元素数量在intset配置范围内
    • 修改配置参数:
    config set set-max-intset-entries 1024
    
  3. 集合运算注意事项

    • 多集合运算复杂度O(N*M),大集合运算可能阻塞服务
    • 考虑使用SUNIONSTORE等存储命令异步处理
  4. 内存优化

    • 小整数(0-9999)有特殊优化,优先使用
    • 定期清理无用集合

六、与其他数据结构对比

结构类型 有序性 唯一性 适用场景
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集合,可以高效解决许多需要去重和集合运算的场景问题。 “`

推荐阅读:
  1. Redis Sorted Set有序集合 存储操作方法
  2. python set集合介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis

上一篇:Linux中mpstat 命令的作用是什么

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》