如何在Redis中管理集合

Introduction: 簡介

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

这个教程解释了如何创建集合,检索和删除成员,以及比较不同集合中的成员。

如何使用本指南

本指南以自包含示例的备忘录形式编写。我们鼓励您跳转到与您即将完成的任务相关的部分。

这个指南中展示的命令在运行Redis 6.0.16版本的Ubuntu 22.04服务器上进行了测试。要创建类似的环境,您可以按照我们关于如何在Ubuntu 22.04上安装和保护Redis的指南中的第一步进行操作。我们将通过redis-cli(Redis命令行界面)运行这些命令来演示其行为。如果您使用的是不同的Redis接口,比如Redli,某些命令的确切输出可能会有所不同。

另外,你也可以提供一个托管的Redis数据库实例来测试这些命令,但请注意,根据数据库提供商允许的控制级别,一些指令在本指南中的描述可能无法正常工作。要提供Silicon Cloud托管数据库,请按照我们的托管数据库产品文档进行操作。然后,你必须安装Redli或设置一个TLS隧道以通过TLS连接到托管数据库。

创建集合

使用sadd命令,你可以创建一个集合并将一个或多个成员添加进去。下面的例子会在一个名为key_horror的键上创建一个集合,并添加成员”Frankenstein”和”Godzilla”。

  1. sadd key_horror “Frankenstein” “Godzilla”

 

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

Output

(integer) 2

如果您尝试将一个集合的成员添加到已经持有非集合值的键中,它将返回一个错误。该代码块中的第一个命令创建了一个名为key_action的列表,其中包含一个元素”Shaft”。

  1. rpush key_action “Shaft”

 

下一个命令尝试将一个集合成员“Shane”添加到列表中,但由于数据类型冲突而导致错误。

  1. sadd key_action “Shane”

 

Output

(error) WRONGTYPE Operation against a key holding the wrong kind of value

请注意,集合中不允许出现相同的成员超过一个。

  1. sadd key_comedy “It’s” “A” “Mad” “Mad” “Mad” “Mad” “Mad” “World”

 

Output

(integer) 4

尽管该 sadd 命令指定了八个成员,但它会丢弃四个重复的 “Mad” 成员,因此最终集合的大小是四。

从集合中获取成员

在本节中,我们将回顾一些返回有关集合成员信息的Redis命令。为了练习所述的命令,请运行以下命令,它将在名为key_stooges的键上创建一个包含六个成员的集合。

  1. sadd key_stooges “Moe” “Larry” “Curly” “Shemp” “Joe” “Curly Joe”

 

要返回集合中的每个成员,运行smembers命令,然后跟上你想要检查的键。

  1. smembers key_stooges

 

Output

1) “Curly” 2) “Moe” 3) “Larry” 4) “Shemp” 5) “Curly Joe” 6) “Joe”

使用sismember命令来检查特定的值是否是集合的成员。

  1. sismember key_stooges “Harpo”

 

如果元素 “Harpo” 是 key_stooges 集合的成员,则 sismember 函数将返回 1。否则,将返回 0。

Output

(integer) 0

要确认给定集合中的成员数量(换句话说,找到给定集合的基数),运行scard。

  1. scard key_stooges

 

Output

(integer) 6

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

  1. srandmember key_stooges

 

Output

“Larry”

要从一个集合中返回多个不同的随机元素,你可以使用srandmember命令以及你想要检索的元素数量。

  1. srandmember key_stooges 3

 

Output

1) “Larry” 2) “Moe” 3) “Curly Joe”

如果你向srandmember传递一个负数,该命令允许返回相同的元素多次。

  1. srandmember key_stooges -3

 

Output

1) “Shemp” 2) “Curly Joe” 3) “Curly Joe”

srandmember函数中使用的随机元素功能并不完全随机,尽管在较大的数据集中它的性能会有所改善。请阅读该命令的官方文档以获取更多详细信息。

从集合中移除成员

Redis提供了三个命令用于从集合中移除成员:spop、srem和smove。

spop从集合中随机选择指定数量的成员并返回,类似于srandmember,但是再从集合中删除这些成员。它接受包含集合的键名和要从集合中移除的成员数量作为参数。如果没有指定数量,spop会默认返回并移除一个值。

以下示例命令将从上一节创建的key_stooges集合中随机选择两个元素并将其删除并返回。

  1. spop key_stooges 2

 

Output

1) “Shemp” 2) “Larry”

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

  1. srem key_stooges “Joe” “Curly Joe”

 

与其返回从集合中删除的成员,srem 返回一个表示被删除成员数量的整数。

Output

(integer) 2

使用smove在两个集合之间移动成员。该命令按顺序接受源集合、目标集合和要移动的成员作为参数。请注意,smove仅允许一次只移动一个成员。

  1. smove key_stooges key_jambands “Moe”

 

如果命令成功移动成员,它将返回(整数)1。

Output

(integer) 1

如果smove操作失败,它会返回(整数)0。请注意,如果目标键不存在,smove在移动成员之前会创建它。

比较集合

Redis还提供了许多命令,用于查找集合之间的差异和相似之处。为了演示这些命令的工作原理,本节将引用三个集合,分别命名为presidents、kings和beatles。如果您想要自行尝试本节中的命令,请使用以下的sadd命令创建这些集合并填充数据。

  1. sadd presidents “George” “John” “Thomas” “James”
  2. sadd kings “Edward” “Henry” “John” “James” “George”
  3. sadd beatles “John” “George” “Paul” “Ringo”

 

sinter函数用于比较不同集合,并返回交集,即出现在所有集合中的值。

  1. sinter presidents kings beatles

 

Output

1) “John” 2) “George”

sinterstore函数的功能类似,但与其返回交集成员,它会在指定的目标位置创建一个包含这些交集成员的新集合。注意,如果目标位置已经存在,sinterstore函数将会覆盖其内容。

  1. sinterstore new_set presidents kings beatles
  2. smembers new_set

 

Output

1) “John” 2) “George”

sdiff 返回集合差异,即从第一个指定的集合中减去每个后续集合的成员。

  1. sdiff presidents kings beatles

 

Output

1) “Thomas”

sdiff函数会对第一个给定集合中的每个成员进行评估,并将其与后续集合中的成员进行比较。如果第一个集合中的任何成员也出现在后续集合中,它将被移除,然后sdiff函数会返回剩余的成员。可以将其视为从第一个集合中移除后续集合的成员。

sdiffstore的功能类似于sdiff,但不同之处在于它不返回集合的差异,而是在指定的目的地创建一个包含集合差异的新集合。

  1. sdiffstore new_set beatles kings presidents
  2. smembers new_set

 

Output

1) “Paul” 2) “Ringo”

和sinterstore一样,如果目标key已经存在,sdiffstore将会覆盖它。

sunion 返回集合的并集,或者是一个包含您指定的所有集合成员的集合。

  1. sunion presidents kings beatles

 

Output

1) “Thomas” 2) “George” 3) “Paul” 4) “Henry” 5) “James” 6) “Edward” 7) “John” 8) “Ringo”

sunion 将结果视为一个新集合,它只允许每个成员仅出现一次。

sunionstore的功能类似,但是它会创建一个新的集合,其中包含给定目标的集合并集,而不是返回结果。

  1. sunionstore new_set presidents kings beatles

 

Output

(integer) 8

与sinterstore和sdiffstore一样,如果目标键已存在,sunionstore将覆盖它。

结论

本指南详细介绍了在Redis中创建和管理集合的一些命令。如果您在本指南中还希望了解其他相关命令、参数或步骤,请在评论中提问或提出建议。

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

发表回复 0

Your email address will not be published. Required fields are marked *