Redis—Set数据类型及其常用下令详解

打印 上一主题 下一主题

主题 1379|帖子 1379|积分 4137


一、Redis概述

Redis概述

Set类型

Redis的Set结构与Java中的HashSet雷同,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet雷同的特性:


  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能
1 SADD:向集合(Set)中添加一个或多个成员


SADD 是 Redis 中用于向集合(Set)中添加一个或多个成员的下令。
  1. SADD key member [member ...]
复制代码


  • key: 集合的键名。
  • member: 要添加到集合中的一个或多个成员。
返回值
  1. redis> SADD myset "Hello"
  2. (integer) 1
  3. redis> SADD myset "World"
  4. (integer) 1
  5. redis> SADD myset "World"
  6. (integer) 0
复制代码
返回被添加到集合中的新成员的数量,不包括已经存在于集合中的成员。
行为说明


  • 对于每个指定的成员,如果该成员不在集合中,则将其添加到集合中。
  • 如果集合不存在,则会创建一个新的集合并添加指定的成员。
  • 如果指定的成员已经是集合的成员,则该成员不会重复添加,操作不产生任何变化。
集合 myset,初始时是空集合。

  • 向集合 myset 中添加成员 "apple":
  1. SADD myset apple
复制代码
执行后,集合变为 {"apple"},返回值是:1。

  • 继续向集合 myset 中添加成员 "orange" 和 "banana":
  1. SADD myset orange banana
复制代码
执行后,集合变为 {"apple", "orange", "banana"},返回值是:2。因为 "orange" 和 "banana" 都是新添加的成员。

  • 尝试重复添加成员 "apple":
  1. SADD myset apple
复制代码
由于 "apple" 已经是集合 myset 的成员,不会重复添加,集合保持稳定。返回值是:0。
使用场景


  • 集合操作:实用于必要管理独特成员集合的场景,例如存储用户的标签、记载已处置惩罚的使命等。
  • 去重:用于确保集合中的元素是唯一的,制止重复数据的存在。
  • 快速查找:集合支持快速的成员查找和操作,得当必要频繁查抄成员存在性的场景。
注意事项


  • 集合中的成员是唯一的,重复添加同一成员不会导致集合内容重复。
  • 如果集合不存在,Redis 会主动创建空集合并执行添加操作。

2 SCARD:获取集合(Set)中成员数量


SCARD 是 Redis 中用于获取集合(Set)中成员数量的下令。
  1. SCARD key
复制代码


  • key: 集合的键名。
返回值
  1. redis> SADD myset "Hello"
  2. (integer) 1
  3. redis> SADD myset "World"
  4. (integer) 1
  5. redis> SCARD myset
  6. (integer) 2
复制代码
返回集合中的成员数量。
行为说明


  • 如果指定的键不存在,返回 0,表示空集合。
  • 如果指定的键对应的值不是集合类型,会返回错误。
示例

  • 获取集合 myset 中的成员数量:
  1. SCARD myset
复制代码
假设集合 myset 中有 3 个成员,那么返回值就是:3。

  • 获取一个空集合的成员数量:
  1. SCARD emptyset
复制代码
假设集合 emptyset 是一个空集合,返回值就是:0。
注意事项


  • 如果键对应的值不是集合类型,会返回错误,因此在使用 SCARD 下令前最好确认键对应的值确实是集合类型。

3 SDIFF:获取多个集合之间的差集


SDIFF 是 Redis 中用于获取多个集合之间的差集(差异)的下令。
  1. SDIFF key [key ...]
复制代码


  • key: 要计算差集的集合键名,可以指定多个集合键名。
返回值
  1. redis> SADD key1 "a"
  2. (integer) 1
  3. redis> SADD key1 "b"
  4. (integer) 1
  5. redis> SADD key1 "c"
  6. (integer) 1
  7. redis> SADD key2 "c"
  8. (integer) 1
  9. redis> SADD key2 "d"
  10. (integer) 1
  11. redis> SADD key2 "e"
  12. (integer) 1
  13. redis> SDIFF key1 key2
  14. 1) "a"
  15. 2) "b"
复制代码
返回一个包含差集成员的列表,即第一个集合与其他集合之间的差异部分。
行为说明


  • 对于给定的多个集合,计算它们之间的差集。
  • 结果会合包含的是第一个集合与其他集合之间的差异部分,即第一个集合中存在,而其他集合中不存在的成员。
示例
两个集合 set1 和 set2

  • 计算 set1 与 set2 之间的差集:
  1. SDIFF set1 set2
复制代码
假设 set1 中有成员 {"a", "b", "c"},而 set2 中有成员 {"b", "c", "d"},那么执行上述下令后,返回值就是 {"a"},表示 set1 中存在而 set2 中不存在的成员。
Tips:


  • 差集操作只能计算两个集合之间的差异,如果必要计算多个集合之间的差集,必要多次调用 SDIFF 下令。
  • 如果指定的某个集合不存在,将视为空集合处置惩罚。

4 SDIFFSTORE:计算多个集合之间的差集,并将结果存储在指定的目标集合中


SDIFFSTORE 是 Redis 中用于计算多个集合之间的差集,并将结果存储在指定的目标集合中的下令。
  1. SDIFFSTORE destination key [key ...]
复制代码


  • destination: 差集结果要存储的目标集合的键名。
  • key: 要计算差集的一个或多个集合键名。
返回值
返回存储在目标集合中的成员数量。
行为说明


  • 计算多个集合之间的差集(即第一个集合与其他集合之间的差异部分),并将差集结果存储在指定的目标集合中。
  • 如果目标集合已经存在,它将被覆盖。
  • 如果指定的某个集合不存在,将视为空集合处置惩罚。
示例
两个集合 set1 和 set2,分别包含一些成员,并且要将它们的差集存储到集合 resultSet 中。

  • 计算 set1 与 set2 之间的差集,并将结果存储到 resultSet:
  1. SDIFFSTORE resultSet set1 set2
复制代码
假设 set1 中有成员 {"a", "b", "c"},而 set2 中有成员 {"b", "c", "d"},执行上述下令后,resultSet 将包含 {"a"},表示 set1 中存在而 set2 中不存在的成员。返回值是 1,表示结果会合有一个成员。

5 SMEMBERS:获取指定集合中所有成员


SMEMBERS 是 Redis 中用于获取指定集合中所有成员的下令。
  1. SMEMBERS key
复制代码


  • key: 要获取成员列表的集合键名。
返回值
  1. redis> SADD myset "Hello"
  2. (integer) 1
  3. redis> SADD myset "World"
  4. (integer) 1
  5. redis> SMEMBERS myset
  6. 1) "Hello"
  7. 2) "World"
复制代码
返回一个包含集合中所有成员的列表。
行为说明


  • 返回指定集合中的所有成员。
  • 如果集合不存在(被认为是一个空集合),则返回空列表。
  • 结果会合的成员顺序不固定,因为它们是无序的。
示例
  1. SMEMBERS myset
复制代码
如果 myset 中有成员 {"member1", "member2", "member3"},那么执行上述下令后,将返回 {"member1", "member2", "member3"},即集合中的所有成员列表。
注意事项


  • 对于大型集合,考虑成员数量可能会对性能产生影响,因此在处置惩罚大型数据时需谨慎使用。
  • 集合中的成员顺序是无序的,因此不能依赖返回的顺序。

6 SISMEMBER:查抄指定成员是否存在于集合中


SISMEMBER 是 Redis 中用于查抄指定成员是否存在于集合中的下令。
  1. SISMEMBER key member
复制代码


  • key: 要查抄的集合键名。
  • member: 要查抄是否存在的成员。
返回值
  1. redis> SADD myset "one"
  2. (integer) 1
  3. redis> SISMEMBER myset "one"
  4. (integer) 1
  5. redis> SISMEMBER myset "two"
  6. (integer) 0
复制代码
返回布尔值:


  • 1 表示成员存在于集合中。
  • 0 表示成员不存在于集合中或者集合本身不存在。
行为说明


  • 查抄指定成员是否存在于指定的集合中。
  • 如果集合不存在,或者成员不在集合中,则返回 0。
  • 如果成员存在于集合中,则返回 1。
示例
集合 myset,此中包含成员 {"member1", "member2", "member3"}:

  • 查抄成员 "member1" 是否存在于集合 myset 中:
    1. SISMEMBER myset "member1"
    复制代码
    如果 "member1" 存在于 myset 中,该下令将返回 1。
  • 查抄成员 "member4" 是否存在于集合 myset 中:
    1. SISMEMBER myset "member4"
    复制代码
    因为 "member4" 不在 myset 中,该下令将返回 0。
注意事项


  • SISMEMBER 下令在集合不存在或成员不存在时都会返回 0,因此必要根据返回值来判断详细情况。
  • 成员的存在性查抄是集合操作中的常见需求,因为 Redis 的集合数据结构支持高效的成员查找和检索。

7 SREM:从集合中移除一个或多个成员


SREM 是 Redis 中用于从集合中移除一个或多个成员的下令。
  1. SREM key member [member ...]
复制代码


  • key: 要操作的集合键名。
  • member [member ...]: 要从集合中移除的一个或多个成员。
返回值
  1. redis> SADD myset "one"
  2. (integer) 1
  3. redis> SADD myset "two"
  4. (integer) 1
  5. redis> SADD myset "three"
  6. (integer) 1
  7. redis> SREM myset "one"
  8. (integer) 1
  9. redis> SREM myset "four"
  10. (integer) 0
复制代码
返回被成功移除的成员数量,不包括不存在的成员。
行为说明


  • 从指定集合中移除一个或多个成员。
  • 如果成员在集合中不存在,则被忽略,不会报错。
  • 如果集合在执行操作前不存在,则会被视为空集合处置惩罚。
示例
集合 myset,此中包含成员 {"member1", "member2", "member3"}:

  • 移除单个成员 "member2":
    1. SREM myset "member2"
    复制代码
    执行后,集合 myset 中将只剩下 {"member1", "member3"}。
  • 移除多个成员 "member1" 和 "member3":
    1. SREM myset "member1" "member3"
    复制代码
    执行后,集合 myset 将变为空集合。
  • 尝试移除不存在的成员 "nonexistent":
    1. SREM myset "nonexistent"
    复制代码
    因为 "nonexistent" 不在 myset 中,该下令不会产生任何影响,并返回 0。
注意事项


  • SREM 操作是原子的,即在执行期间不会有其他客户端能够对同一集合进行操作。
  • 虽然 SREM 对不存在的成员不会报错,但执行过程中会返回实际移除的成员数量。

8 SINTER:计算多个集合的交集


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

  1. SINTER key [key ...]
复制代码


  • key [key ...]: 一个或多个集合键名。
返回值
返回一个包含交集成员的列表。
行为说明


  • 计算给定多个集合的交集。
  • 如果此中一个或多个集合不存在,则返回空列表(空集合)。
  • 结果会合的每个成员都是同时存在于所有输入集合中的成员。
示例
假设有两个集合 set1 和 set2:

  • set1 中包含成员 {"member1", "member2", "member3"}。
  • set2 中包含成员 {"member2", "member3", "member4"}。
计算它们的交集:
  1. SINTER set1 set2
复制代码
执行后,返回的结果将是 {"member2", "member3"},因为这两个成员是同时存在于 set1 和 set2 中。
注意事项


  • 如果输入的集合中有一个或多个不存在,结果将是空集合。
  • SINTER 下令返回的交集结果是一个新的集合,并不会修改输入的任何集合。

9 SMOVE:将一个成员从一个集合移动到另一个集合


SMOVE 是 Redis 中用于将一个成员从一个集合移动到另一个集合的下令。
  1. SMOVE source destination member
复制代码


  • source: 源集合的键名。
  • destination: 目标集合的键名。
  • member: 要移动的成员。
返回值
返回整数值:


  • 1:如果成员被成功移动。
  • 0:如果成员未被移动,即成员不存在于源集合中或者成员已存在于目标集合中。
行为说明


  • 如果源集合中存在该成员,则将其从源集合移除并添加到目标集合中。
  • 如果目标集合中已经存在该成员,或者源集合中不存在该成员,则不会进行任何操作。
  • 如果源集合和目标集合是同一集合,该下令相称于什么都不做,但会返回 0。
示例
两个集合 set1 和 set2:

  • set1 中包含成员 {"member1", "member2", "member3"}。
  • set2 中包含成员 {"member4", "member5"}。
移动成员 member2 从 set1 到 set2:
  1. SMOVE set1 set2 "member2"
复制代码
执行后:


  • set1 将变成 {"member1", "member3"}。
  • set2 将变成 {"member4", "member5", "member2"}。
  • 返回值为 1。
尝试移动不存在的成员 member6 从 set1 到 set2:
  1. SMOVE set1 set2 "member6"
复制代码
执行后:


  • set1 和 set2 保持稳定。
  • 返回值为 0。
注意事项


  • SMOVE 下令是原子的,下令执行过程中不会有其他客户端能够对这两个集合进行操作。
  • 纵然源集合和目标集合是同一个集合,下令也不会报错,但返回 0。

更多的Set下令可以去官网https://redis.io/docs/latest/commands/?group=set检察哦~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表