引言

Redis 是一个开源的、内存中的键值数据存储。 Redis 中的集合是存储在给定键上的字符串的集合。 在集合中保存时,单个记录值被称为成员。 与列表不同,集合是无序的,不允许重复值。

本教程解释如何创建集合、检索和删除成员以及比较不同集合的成员。

如何使用本指南

本指南是作为包含自包含示例的备忘单编写的。 我们鼓励您跳转到任何与您正在尝试完成的任务相关的部分。

本指南中显示的命令是在运行 Redis 4.0.9版本的 Ubuntu 18.04服务器上测试的。 要建立一个类似的环境,你可以按照我们关于如何在 Ubuntu 18.04上安装和保护 Redis 的指南的第一步。 我们将通过使用 Redis-cli (Redis 命令行界面)运行这些命令来演示它们的行为。 请注意,如果您使用的是不同的 Redis 接口ーー例如 Redli ーー某些命令的确切输出可能会有所不同。

或者,您可以提供一个托管 Redis 数据库实例来测试这些命令,但是请注意,根据您的数据库提供程序所允许的控制级别,本指南中的某些命令可能不能像描述的那样工作。 要提供一个数字数据库管理数据库,请遵循我们的管理数据库产品文档。 然后,必须安装 Redli 或设置 TLS 通道,以便通过 TLS 连接到托管数据库。

创建集合

Sadd 命令允许您创建一个集合并向其中添加一个或多个成员。 下面的例子将创建一组名为 key horror 的关键字,其成员为“ Frankenstein”和“ Godzilla” :

  • sadd key_horror "Frankenstein" "Godzilla"

如果成功,sadd 将返回一个整数,显示它向集合添加了多少成员:

Output
(integer) 2

如果尝试将集合的成员添加到已经包含非集合值的键,则会返回错误。 该块中的第一个命令创建一个名为 key action 的列表,其中包含一个元素“ Shaft”。 下一个命令尝试添加一个 set 成员“ Shane”到列表中,但是这会产生一个错误,因为数据类型发生冲突:

  • rpush key_action "Shaft"
  • sadd key_action "Shane"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value

注意,集合不允许同一个成员出现多次:

  • sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
Output
(integer) 4

尽管 sadd 命令指定了8个成员,但它丢弃了4个重复的“ Mad”成员,从而得到了4个设置大小。

从集合中检索成员

在本节中,我们将介绍一些 Redis 命令,这些命令返回关于集合中所包含的成员的信息。 为了练习这里列出的命令,运行下面的命令,它将创建一个由6个成员组成的集合,该集合在一个称为 key stooges 的键上:

  • sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"

若要返回集合中的每个成员,请运行 smembers 命令,后跟要检查的键:

  • smembers key_stooges
Output
1) "Curly" 2) "Moe" 3) "Larry" 4) "Shemp" 5) "Curly Joe" 6) "Joe"

要检查一个特定的值是否是一个集合的成员,使用 sismember 命令:

  • sismember key_stooges "Harpo"

如果元素“ Harpo”是 key stooges set 的成员,sismember 将返回1。 否则,它将返回0:

Output
(integer) 0

要查看给定集合中有多少个成员(换句话说,要查找给定集合的基数) ,请运行 scard:

  • scard key_stooges
Output
(integer) 6

要从集合中返回一个随机元素,运行 srandmember:

  • srandmember key_stooges
Output
"Larry"

要从一个集合中返回多个随机的、不同的元素,可以按照 srandmember 命令返回要检索的元素数:

  • srandmember key_stooges 3
Output
1) "Larry" 2) "Moe" 3) "Curly Joe"

如果你传递一个负数给 srandmember,这个命令可以多次返回同一个元素:

  • srandmember key_stooges -3
Output
1) "Shemp" 2) "Curly Joe" 3) "Curly Joe"

在随机成员中使用的随机元函数并不是完全随机的,尽管它在较大的数据集中的性能有所提高。 有关更多细节,请参阅命令的官方文档。

从集合中删除成员

Redis 附带了三个命令,用于从集合中删除成员: spop、 rem 和 smove。

Spop 从集合中随机选择指定数量的成员并返回它们,类似于 srandmember,但是然后从集合中删除它们。 它接受包含集合的键的名称和要从集合中删除的成员数作为参数。 如果不指定数字,spop 将默认返回并删除单个值。

下面的示例命令将从上一节创建的关键配置中删除并返回两个随机选择的元素:

  • spop key_stooges 2
Output
1) "Shemp" 2) "Larry"

允许你从一个集合中移除一个或多个特定的成员,而不是随机的:

  • srem key_stooges "Joe" "Curly Joe"

不返回从集合中删除的成员,而是返回一个整数,显示删除了多少成员:

Output
(integer) 2

使用 smove 将成员从一个集合移动到另一个集合。 该命令按照该顺序接受源集、目标集和要移动的成员作为参数。 注意,smove 只允许您一次移动一个成员:

  • smove key_stooges key_jambands "Moe"

如果命令成功移动成员,它将返回(integer)1:

Output
(integer) 1

如果 smove 失败,它将返回(integer)0。 注意,如果目标键不存在,smove 将在将成员移动到目标键之前创建它。

比较集合

Redis 还提供了许多命令,用于查找集合之间的差异和相似之处。 为了演示这些工作原理,本节将引用三组名为“总统”、“国王”和“披头士”的歌曲。 如果你想自己尝试这一部分中的命令,创建这些集合并使用以下 sadd 命令填充它们:

  • sadd presidents "George" "John" "Thomas" "James"
  • sadd kings "Edward" "Henry" "John" "James" "George"
  • sadd beatles "John" "George" "Paul" "Ringo"

烧结比较不同的集合,并返回设置的交集,或出现在每个集合中的值:

  • sinter presidents kings beatles
Output
1) "John" 2) "George"

Sinterstore 执行类似的功能,但是它不返回相交的成员,而是在指定的目的地创建一个包含这些相交成员的新集合。 请注意,如果目的地已经存在,sinterstore 将覆盖其内容:

  • sinterstore new_set presidents kings beatles
  • smembers new_set
Output
1) "John" 2) "George"

Sdiff 返回集合的差值ー由第一个指定集合与下列每个集合的差值产生的成员:

  • sdiff presidents kings beatles
Output
1) "Thomas"

换句话说,sdiff 查看第一个给定集合中的每个成员,然后将这些成员与每个后续集合中的成员进行比较。 第一个集合中出现在以下集合中的任何成员都将被删除,sdiff 将返回其余成员。 可以把它看作是从第一个集合中删除后续集合的成员。

Sdiffstore 执行一个类似于 sdiff 的函数,但它不返回 set difference,而是在给定的目的地创建一个新的 set,包含 set difference:

  • sdiffstore new_set beatles kings presidents
  • smembers new_set
Output
1) "Paul" 2) "Ringo"

就像 sinterstore 一样,如果目标已经存在,sdiffstore 也会覆盖它。

Sunion 返回 set union,或者一个包含你指定的每个集合的每个成员的集合:

  • sunion presidents kings beatles
Output
1) "Thomas" 2) "George" 3) "Paul" 4) "Henry" 5) "James" 6) "Edward" 7) "John" 8) "Ringo"

Sunion 对待结果就像一个新的集合,它只允许任何给定的成员出现一次。

Sunionstore 执行一个类似的功能,但是在给定的目的地创建一个包含 set union 的新集合,而不是仅仅返回结果:

  • sunionstore new_set presidents kings beatles
Output
(integer) 8

如同 sinterstore 和 sdiffstore 一样,sunionstore 将覆盖已经存在的目标键。

总结

本指南详细介绍了在 Redis 用于创建和管理集合的许多命令。 如果还有其他相关的命令、参数或者程序你想在本指南中看到,请在下面的评论中询问或者提出建议。

有关 Redis 命令的更多信息,请参见我们关于如何管理 Redis 数据库的系列教程。