Redis—Set数据类型及其常用下令详解
一、Redis概述Redis概述
https://i-blog.csdnimg.cn/blog_migrate/c83713ccae3a2afcbd3f73975bc03015.png
Set类型
Redis的Set结构与Java中的HashSet雷同,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet雷同的特性:
[*] 无序
[*] 元素不可重复
[*] 查找快
[*] 支持交集、并集、差集等功能
1 SADD:向集合(Set)中添加一个或多个成员
https://i-blog.csdnimg.cn/blog_migrate/caac680993019606f476d17765888872.png
SADD 是 Redis 中用于向集合(Set)中添加一个或多个成员的下令。
SADD key 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)中成员数量
https://i-blog.csdnimg.cn/blog_migrate/5ddaeb7519737221b2c5a325bb46f093.png
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:获取多个集合之间的差集
https://i-blog.csdnimg.cn/blog_migrate/952b9e8c2dc6b5286f943bddd9b52257.png
SDIFF 是 Redis 中用于获取多个集合之间的差集(差异)的下令。
SDIFF 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:计算多个集合之间的差集,并将结果存储在指定的目标集合中
https://i-blog.csdnimg.cn/blog_migrate/5635a35f10ac4961498ff8627797c10c.png
SDIFFSTORE 是 Redis 中用于计算多个集合之间的差集,并将结果存储在指定的目标集合中的下令。
SDIFFSTORE destination 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:获取指定集合中所有成员
https://i-blog.csdnimg.cn/blog_migrate/30e4d138279a564546ad0a8689b143d6.png
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:查抄指定成员是否存在于集合中
https://i-blog.csdnimg.cn/blog_migrate/a529296e132bd223a92b5938e26f16a0.png
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:从集合中移除一个或多个成员
https://i-blog.csdnimg.cn/blog_migrate/d0410e1bf989040f33713ff77d3f243f.png
SREM 是 Redis 中用于从集合中移除一个或多个成员的下令。
SREM key member
[*]key: 要操作的集合键名。
[*]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:计算多个集合的交集
https://i-blog.csdnimg.cn/blog_migrate/4525f37d7336f124509c4e6d41dfd90d.png
SINTER 是 Redis 中用于计算多个集合的交集的下令。
https://i-blog.csdnimg.cn/blog_migrate/6e2e43dfe89531d79ab42752853370a9.png
SINTER key
[*]key : 一个或多个集合键名。
返回值
返回一个包含交集成员的列表。
行为说明
[*]计算给定多个集合的交集。
[*]如果此中一个或多个集合不存在,则返回空列表(空集合)。
[*]结果会合的每个成员都是同时存在于所有输入集合中的成员。
示例
假设有两个集合 set1 和 set2:
[*]set1 中包含成员 {"member1", "member2", "member3"}。
[*]set2 中包含成员 {"member2", "member3", "member4"}。
计算它们的交集:
SINTER set1 set2
执行后,返回的结果将是 {"member2", "member3"},因为这两个成员是同时存在于 set1 和 set2 中。
注意事项
[*]如果输入的集合中有一个或多个不存在,结果将是空集合。
[*]SINTER 下令返回的交集结果是一个新的集合,并不会修改输入的任何集合。
9 SMOVE:将一个成员从一个集合移动到另一个集合
https://i-blog.csdnimg.cn/blog_migrate/49a8cb5b56c7d04e26cc6c35d24e2fdb.png
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检察哦~
https://i-blog.csdnimg.cn/blog_migrate/c3130be42f0e99a6ad050eca41803f0d.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]