文章目录
- 一、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查看哦~