Redis 的 Set(集合)本质上是一种基于 String 类型实现的无序集合结构。它最重要的特点之一就是成员自动去重,也就是说,重复元素不会被重复存储在集合中。
在底层实现方面,Redis Set 的编码方式通常可能是 intset,也可能是 hashtable,具体取决于集合中元素的类型和数量。

Redis 集合通常通过哈希表来实现,因此在执行添加、删除、查找等常见操作时,时间复杂度通常都为 O(1),这也是 Redis Set 适合高性能去重、标签管理和关系运算场景的重要原因。
单个 Redis 集合最多可以容纳 232 - 1 个成员,也就是 4294967295。换句话说,一个 Set 集合理论上最多能够存储 40 多亿个成员。
实例
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"
2) "mongodb"
3) "redis"
在上面的 Redis Set 示例中,我们通过 SADD 命令向名为 runoobkey 的集合中添加了三个元素。由于集合具备自动去重特性,重复插入 mysql 时返回结果为 0,表示该成员已经存在。
Redis 集合命令
下表汇总了 Redis 集合(Set)常用的基础命令:
| 序号 | 命令及描述 |
|---|---|
| 1 | SADD key member1 [member2] 向集合中添加一个或多个成员 |
| 2 | SCARD key 获取集合中的成员数量 |
| 3 | SDIFF key1 [key2] 返回第一个集合与其他集合之间的差集 |
| 4 | SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集,并将结果存储到 destination 中 |
| 5 | SINTER key1 [key2] 返回给定所有集合的交集 |
| 6 | SINTERSTORE destination key1 [key2] 返回给定所有集合的交集,并将结果存储到 destination 中 |
| 7 | SISMEMBER key member 判断 member 元素是否属于集合 key 的成员 |
| 8 | SMEMBERS key 返回集合中的全部成员 |
| 9 | SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合 |
| 10 | SPOP key 随机移除并返回集合中的一个元素 |
| 11 | SRANDMEMBER key [count] 随机返回集合中的一个或多个成员 |
| 12 | SREM key member1 [member2] 删除集合中的一个或多个成员 |
| 13 | SUNION key1 [key2] 返回所有给定集合的并集结果 |
| 14 | SUNIONSTORE destination key1 [key2] 将所有给定集合的并集存储到 destination 集合中 |
| 15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代遍历集合中的元素 |
