文章目录
- 一、Redis概述
- Set类型
- 1 SADD:向集合(Set)中添加一个或多个成员
- 2 SCARD:获取集合(Set)中成员数量
- 3 SDIFF:获取多个集合之间的差集
- 4 SDIFFSTORE:计算多个集合之间的差集,并将结果存储在指定的目标集合中
- 5 SMEMBERS:获取指定集合中所有成员
- 6 SISMEMBER:检查指定成员是否存在于集合中
- 7 SREM:从集合中移除一个或多个成员
- 8 SINTER:计算多个集合的交集
- 9 SMOVE:将一个成员从一个集合移动到另一个集合
一、Redis概述
Redis概述

Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
-
无序
-
元素不可重复
-
查找快
-
支持交集、并集、差集等功能
1 SADD:向集合(Set)中添加一个或多个成员

SADD 是 Redis 中用于向集合(Set)中添加一个或多个成员的命令。
SADD key member [member ...]
key: 集合的键名。member: 要添加到集合中的一个或多个成员。
返回值
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
返回被添加到集合中的新成员的数量,不包括已经存在于集合中的成员。
行为说明
- 对于每个指定的成员,如果该成员不在集合中,则将其添加到集合中。
- 如果集合不存在,则会创建一个新的集合并添加指定的成员。
- 如果指定的成员已经是集合的成员,则该成员不会重复添加,操作不产生任何变化。
集合 myset,初始时是空集合。
- 向集合
myset中添加成员"apple":
SADD myset apple
执行后,集合变为 {"apple"},返回值是:1。
- 继续向集合
myset中添加成员"orange"和"banana":
SADD myset orange banana
执行后,集合变为 {"apple", "orange", "banana"},返回值是:2。因为 "orange" 和 "banana" 都是新添加的成员。
- 尝试重复添加成员
"apple":
SADD myset apple
由于 "apple" 已经是集合 myset 的成员,不会重复添加,集合保持不变。返回值是:0。
使用场景
- 集合操作:适用于需要管理独特成员集合的场景,例如存储用户的标签、记录已处理的任务等。
- 去重:用于确保集合中的元素是唯一的,避免重复数据的存在。
- 快速查找:集合支持快速的成员查找和操作,适合需要频繁检查成员存在性的场景。
注意事项
- 集合中的成员是唯一的,重复添加同一成员不会导致集合内容重复。
- 如果集合不存在,Redis 会自动创建空集合并执行添加操作。
2 SCARD:获取集合(Set)中成员数量

SCARD 是 Redis 中用于获取集合(Set)中成员数量的命令。
SCARD key
key: 集合的键名。
返回值
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2
返回集合中的成员数量。
行为说明
- 如果指定的键不存在,返回 0,表示空集合。
- 如果指定的键对应的值不是集合类型,会返回错误。
示例
- 获取集合
myset中的成员数量:
SCARD myset
假设集合 myset 中有 3 个成员,那么返回值就是:3。
- 获取一个空集合的成员数量:
SCARD emptyset
假设集合 emptyset 是一个空集合,返回值就是:0。
注意事项
- 如果键对应的值不是集合类型,会返回错误,因此在使用
SCARD命令前最好确认键对应的值确实是集合类型。
3 SDIFF:获取多个集合之间的差集

SDIFF 是 Redis 中用于获取多个集合之间的差集(差异)的命令。
SDIFF key [key ...]
key: 要计算差集的集合键名,可以指定多个集合键名。
返回值
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"
返回一个包含差集成员的列表,即第一个集合与其他集合之间的差异部分。
行为说明
- 对于给定的多个集合,计算它们之间的差集。
- 结果集中包含的是第一个集合与其他集合之间的差异部分,即第一个集合中存在,而其他集合中不存在的成员。
示例
两个集合 set1 和 set2
- 计算
set1与set2之间的差集:
SDIFF set1 set2
假设 set1 中有成员 {"a", "b", "c"},而 set2 中有成员 {"b", "c", "d"},那么执行上述命令后,返回值就是 {"a"},表示 set1 中存在而 set2 中不存在的成员。
Tips:
- 差集操作只能计算两个集合之间的差异,如果需要计算多个集合之间的差集,需要多次调用
SDIFF命令。 - 如果指定的某个集合不存在,将视为空集合处理。
4 SDIFFSTORE:计算多个集合之间的差集,并将结果存储在指定的目标集合中

SDIFFSTORE 是 Redis 中用于计算多个集合之间的差集,并将结果存储在指定的目标集合中的命令。
SDIFFSTORE destination key [key ...]
destination: 差集结果要存储的目标集合的键名。key: 要计算差集的一个或多个集合键名。
返回值
返回存储在目标集合中的成员数量。
行为说明
- 计算多个集合之间的差集(即第一个集合与其他集合之间的差异部分),并将差集结果存储在指定的目标集合中。
- 如果目标集合已经存在,它将被覆盖。
- 如果指定的某个集合不存在,将视为空集合处理。
示例
两个集合 set1 和 set2,分别包含一些成员,并且要将它们的差集存储到集合 resultSet 中。
- 计算
set1与set2之间的差集,并将结果存储到resultSet:
SDIFFSTORE resultSet set1 set2
假设 set1 中有成员 {"a", "b", "c"},而 set2 中有成员 {"b", "c", "d"},执行上述命令后,resultSet 将包含 {"a"},表示 set1 中存在而 set2 中不存在的成员。返回值是 1,表示结果集中有一个成员。
5 SMEMBERS:获取指定集合中所有成员

SMEMBERS 是 Redis 中用于获取指定集合中所有成员的命令。
SMEMBERS key
key: 要获取成员列表的集合键名。
返回值
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"
返回一个包含集合中所有成员的列表。
行为说明
- 返回指定集合中的所有成员。
- 如果集合不存在(被认为是一个空集合),则返回空列表。
- 结果集中的成员顺序不固定,因为它们是无序的。
示例
SMEMBERS myset
如果 myset 中有成员 {"member1", "member2", "member3"},那么执行上述命令后,将返回 {"member1", "member2", "member3"},即集合中的所有成员列表。
注意事项
- 对于大型集合,考虑成员数量可能会对性能产生影响,因此在处理大型数据时需谨慎使用。
- 集合中的成员顺序是无序的,因此不能依赖返回的顺序。
6 SISMEMBER:检查指定成员是否存在于集合中

SISMEMBER 是 Redis 中用于检查指定成员是否存在于集合中的命令。
SISMEMBER key member
key: 要检查的集合键名。member: 要检查是否存在的成员。
返回值
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0
返回布尔值:
1表示成员存在于集合中。0表示成员不存在于集合中或者集合本身不存在。
行为说明
- 检查指定成员是否存在于指定的集合中。
- 如果集合不存在,或者成员不在集合中,则返回
0。 - 如果成员存在于集合中,则返回
1。
示例
集合 myset,其中包含成员 {"member1", "member2", "member3"}:
-
检查成员
"member1"是否存在于集合myset中:SISMEMBER myset "member1"如果
"member1"存在于myset中,该命令将返回1。 -
检查成员
"member4"是否存在于集合myset中:SISMEMBER myset "member4"因为
"member4"不在myset中,该命令将返回0。
注意事项
SISMEMBER命令在集合不存在或成员不存在时都会返回0,因此需要根据返回值来判断具体情况。- 成员的存在性检查是集合操作中的常见需求,因为 Redis 的集合数据结构支持高效的成员查找和检索。
7 SREM:从集合中移除一个或多个成员

SREM 是 Redis 中用于从集合中移除一个或多个成员的命令。
SREM key member [member ...]
key: 要操作的集合键名。member [member ...]: 要从集合中移除的一个或多个成员。
返回值
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
返回被成功移除的成员数量,不包括不存在的成员。
行为说明
- 从指定集合中移除一个或多个成员。
- 如果成员在集合中不存在,则被忽略,不会报错。
- 如果集合在执行操作前不存在,则会被视为空集合处理。
示例
集合 myset,其中包含成员 {"member1", "member2", "member3"}:
-
移除单个成员
"member2":SREM myset "member2"执行后,集合
myset中将只剩下{"member1", "member3"}。 -
移除多个成员
"member1"和"member3":SREM myset "member1" "member3"执行后,集合
myset将变为空集合。 -
尝试移除不存在的成员
"nonexistent":SREM myset "nonexistent"因为
"nonexistent"不在myset中,该命令不会产生任何影响,并返回0。
注意事项
SREM操作是原子的,即在执行期间不会有其他客户端能够对同一集合进行操作。- 虽然
SREM对不存在的成员不会报错,但执行过程中会返回实际移除的成员数量。
8 SINTER:计算多个集合的交集

SINTER 是 Redis 中用于计算多个集合的交集的命令。

SINTER key [key ...]
key [key ...]: 一个或多个集合键名。
返回值
返回一个包含交集成员的列表。
行为说明
- 计算给定多个集合的交集。
- 如果其中一个或多个集合不存在,则返回空列表(空集合)。
- 结果集中的每个成员都是同时存在于所有输入集合中的成员。
示例
假设有两个集合 set1 和 set2:
set1中包含成员{"member1", "member2", "member3"}。set2中包含成员{"member2", "member3", "member4"}。
计算它们的交集:
SINTER set1 set2
执行后,返回的结果将是 {"member2", "member3"},因为这两个成员是同时存在于 set1 和 set2 中。
注意事项
- 如果输入的集合中有一个或多个不存在,结果将是空集合。
SINTER命令返回的交集结果是一个新的集合,并不会修改输入的任何集合。
9 SMOVE:将一个成员从一个集合移动到另一个集合

SMOVE 是 Redis 中用于将一个成员从一个集合移动到另一个集合的命令。
SMOVE source destination member
source: 源集合的键名。destination: 目标集合的键名。member: 要移动的成员。
返回值
返回整数值:
1:如果成员被成功移动。0:如果成员未被移动,即成员不存在于源集合中或者成员已存在于目标集合中。
行为说明
- 如果源集合中存在该成员,则将其从源集合移除并添加到目标集合中。
- 如果目标集合中已经存在该成员,或者源集合中不存在该成员,则不会进行任何操作。
- 如果源集合和目标集合是同一集合,该命令相当于什么都不做,但会返回
0。
示例
两个集合 set1 和 set2:
set1中包含成员{"member1", "member2", "member3"}。set2中包含成员{"member4", "member5"}。
移动成员 member2 从 set1 到 set2:
SMOVE set1 set2 "member2"
执行后:
set1将变成{"member1", "member3"}。set2将变成{"member4", "member5", "member2"}。- 返回值为
1。
尝试移动不存在的成员 member6 从 set1 到 set2:
SMOVE set1 set2 "member6"
执行后:
set1和set2保持不变。- 返回值为
0。
注意事项
SMOVE命令是原子的,命令执行过程中不会有其他客户端能够对这两个集合进行操作。- 即使源集合和目标集合是同一个集合,命令也不会报错,但返回
0。
更多的Set命令可以去官网https://redis.io/docs/latest/commands/?group=set查看哦~
