Redis Set 相关指令
Redis的Set类型是一种无序且唯一元素集合,基于高效的数据结构实现,支持快速的成员检测、集合运算及随机操作。
- 底层实现
- intset(整数集合):当元素全为整数且数量较少时,Redis使用紧凑的
intset存储,节省内存。 - hashtable(哈希表):默认实现方式,元素以哈希表的键存储(值为
NULL),保证唯一性并支持快速查找。
- intset(整数集合):当元素全为整数且数量较少时,Redis使用紧凑的
- 自动转换机制
- 当元素数量超过
set-max-intset-entries配置(默认512)或包含非整数元素时,自动转换为hashtable。
- 当元素数量超过
- 无序且唯一
元素无顺序,且自动去重,适合需要唯一值的场景(如标签、用户ID集合)。 - 高效集合运算
支持交集(SINTER)、并集(SUNION)、差集(SDIFF),时间复杂度为O(N),适用于关联数据分析。 - 快速成员检测
判断元素是否存在(SISMEMBER)的时间复杂度为O(1),适合高频查询场景。 - 随机操作支持
SPOP:随机移除并返回元素(如抽奖)。SRANDMEMBER:随机获取元素但不删除。
| 指令 | 作用 | 示例 | 时间复杂度 |
|---|---|---|---|
1. SADD | 添加元素 | SADD tags "redis" "db" | O(1) 每元素 |
2. SREM | 删除元素 | SREM tags "db" | O(1) 每元素 |
3. SISMEMBER | 判断元素是否存在 | SISMEMBER tags "redis" | O(1) |
4. SMEMBERS | 获取所有元素 | SMEMBERS tags | O(N) |
5. SCARD | 获取元素数量 | SCARD tags | O(1) |
6. SPOP | 随机移除并返回元素 | SPOP tags 2(移除2个) | O(1) 每元素 |
7. SINTER | 多集合交集 | SINTER set1 set2 | O(N*M) |
8. SUNION | 多集合并集 | SUNION set1 set2 | O(N) |
9. SDIFF | 多集合差集(set1 - set2) | SDIFF set1 set2 | O(N) |
10. SUNIONSTORE | 存储并集结果 | SUNIONSTORE result set1 set2 | O(N) |
11. SMOVE | 移动元素到另一集合 | SMOVE src dst "redis" | O(1) |
- 去重存储
SADD user:1001:visited_pages "home" "product/123"记录用户唯一行为(如一天内访问的页面ID)。
- 标签系统
SADD user:1001:tags "tech" "coding"SADD user:1002:tags "tech" "design"SINTER user:1001:tags user:1002:tags # 返回共同标签 ["tech"]用户标签管理,快速查找共同兴趣。
- 抽奖/随机推荐
SADD lottery_users "user1" "user2" "user3"SPOP lottery_users 1 # 随机选1名中奖者利用
SPOP实现公平抽奖,或SRANDMEMBER随机展示内容。
- 社交关系
SADD user:A:followings "user:B" "user:C"SADD user:B:followings "user:C" "user:D"SINTER user:A:followings user:B:followings # 共同关注 ["user:C"]存储用户关注列表,计算共同关注。
- 黑白名单控制
SADD allowed_ips "192.168.1.1" "10.0.0.2"SISMEMBER allowed_ips "10.0.0.2" # 返回1(存在)快速验证IP或用户是否在允许/禁止列表中。
注意事项
- 无序性限制
Set无法按插入顺序访问元素,需顺序操作时应改用List或Sorted Set。 - 大集合性能
SMEMBERS获取全部元素时,若集合过大(如百万级)可能阻塞服务,建议用SSCAN分批遍历。- 集合运算(如
SINTER)在数据量大时消耗较高,建议在从节点执行或拆分集合。
- 内存优化
尽量使用整数元素(触发intset存储),或通过分片(如按哈希取模拆分为多个Set)降低单个集合大小。 - 去重与更新
Set自动去重,但无法存储关联值(如分数),需扩展数据模型时可结合Hash或Sorted Set。
通过合理利用Redis Set的特性,可高效实现去重、关联计算和随机化处理,尤其适合社交网络、实时统计等场景。