如何在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”。
- sadd key_horror “Frankenstein” “Godzilla”
如果成功,sadd将返回一个整数,显示它向集合中添加了多少个成员。
(integer) 2
如果您尝试将一个集合的成员添加到已经持有非集合值的键中,它将返回一个错误。该代码块中的第一个命令创建了一个名为key_action的列表,其中包含一个元素”Shaft”。
- rpush key_action “Shaft”
下一个命令尝试将一个集合成员“Shane”添加到列表中,但由于数据类型冲突而导致错误。
- sadd key_action “Shane”
(error) WRONGTYPE Operation against a key holding the wrong kind of value
请注意,集合中不允许出现相同的成员超过一个。
- sadd key_comedy “It’s” “A” “Mad” “Mad” “Mad” “Mad” “Mad” “World”
(integer) 4
尽管该 sadd 命令指定了八个成员,但它会丢弃四个重复的 “Mad” 成员,因此最终集合的大小是四。
从集合中获取成员
在本节中,我们将回顾一些返回有关集合成员信息的Redis命令。为了练习所述的命令,请运行以下命令,它将在名为key_stooges的键上创建一个包含六个成员的集合。
- sadd key_stooges “Moe” “Larry” “Curly” “Shemp” “Joe” “Curly Joe”
要返回集合中的每个成员,运行smembers命令,然后跟上你想要检查的键。
- smembers key_stooges
1) “Curly” 2) “Moe” 3) “Larry” 4) “Shemp” 5) “Curly Joe” 6) “Joe”
使用sismember命令来检查特定的值是否是集合的成员。
- sismember key_stooges “Harpo”
如果元素 “Harpo” 是 key_stooges 集合的成员,则 sismember 函数将返回 1。否则,将返回 0。
(integer) 0
要确认给定集合中的成员数量(换句话说,找到给定集合的基数),运行scard。
- scard key_stooges
(integer) 6
要从集合中返回一个随机元素,请运行srandmember。
- srandmember key_stooges
“Larry”
要从一个集合中返回多个不同的随机元素,你可以使用srandmember命令以及你想要检索的元素数量。
- srandmember key_stooges 3
1) “Larry” 2) “Moe” 3) “Curly Joe”
如果你向srandmember传递一个负数,该命令允许返回相同的元素多次。
- srandmember key_stooges -3
1) “Shemp” 2) “Curly Joe” 3) “Curly Joe”
srandmember函数中使用的随机元素功能并不完全随机,尽管在较大的数据集中它的性能会有所改善。请阅读该命令的官方文档以获取更多详细信息。
从集合中移除成员
Redis提供了三个命令用于从集合中移除成员:spop、srem和smove。
spop从集合中随机选择指定数量的成员并返回,类似于srandmember,但是再从集合中删除这些成员。它接受包含集合的键名和要从集合中移除的成员数量作为参数。如果没有指定数量,spop会默认返回并移除一个值。
以下示例命令将从上一节创建的key_stooges集合中随机选择两个元素并将其删除并返回。
- spop key_stooges 2
1) “Shemp” 2) “Larry”
srem 允许你从集合中移除一个或多个特定成员,而不是随机的成员。
- srem key_stooges “Joe” “Curly Joe”
与其返回从集合中删除的成员,srem 返回一个表示被删除成员数量的整数。
(integer) 2
使用smove在两个集合之间移动成员。该命令按顺序接受源集合、目标集合和要移动的成员作为参数。请注意,smove仅允许一次只移动一个成员。
- smove key_stooges key_jambands “Moe”
如果命令成功移动成员,它将返回(整数)1。
(integer) 1
如果smove操作失败,它会返回(整数)0。请注意,如果目标键不存在,smove在移动成员之前会创建它。
比较集合
Redis还提供了许多命令,用于查找集合之间的差异和相似之处。为了演示这些命令的工作原理,本节将引用三个集合,分别命名为presidents、kings和beatles。如果您想要自行尝试本节中的命令,请使用以下的sadd命令创建这些集合并填充数据。
- sadd presidents “George” “John” “Thomas” “James”
- sadd kings “Edward” “Henry” “John” “James” “George”
- sadd beatles “John” “George” “Paul” “Ringo”
sinter函数用于比较不同集合,并返回交集,即出现在所有集合中的值。
- sinter presidents kings beatles
1) “John” 2) “George”
sinterstore函数的功能类似,但与其返回交集成员,它会在指定的目标位置创建一个包含这些交集成员的新集合。注意,如果目标位置已经存在,sinterstore函数将会覆盖其内容。
- sinterstore new_set presidents kings beatles
- smembers new_set
1) “John” 2) “George”
sdiff 返回集合差异,即从第一个指定的集合中减去每个后续集合的成员。
- sdiff presidents kings beatles
1) “Thomas”
sdiff函数会对第一个给定集合中的每个成员进行评估,并将其与后续集合中的成员进行比较。如果第一个集合中的任何成员也出现在后续集合中,它将被移除,然后sdiff函数会返回剩余的成员。可以将其视为从第一个集合中移除后续集合的成员。
sdiffstore的功能类似于sdiff,但不同之处在于它不返回集合的差异,而是在指定的目的地创建一个包含集合差异的新集合。
- sdiffstore new_set beatles kings presidents
- smembers new_set
1) “Paul” 2) “Ringo”
和sinterstore一样,如果目标key已经存在,sdiffstore将会覆盖它。
sunion 返回集合的并集,或者是一个包含您指定的所有集合成员的集合。
- sunion presidents kings beatles
1) “Thomas” 2) “George” 3) “Paul” 4) “Henry” 5) “James” 6) “Edward” 7) “John” 8) “Ringo”
sunion 将结果视为一个新集合,它只允许每个成员仅出现一次。
sunionstore的功能类似,但是它会创建一个新的集合,其中包含给定目标的集合并集,而不是返回结果。
- sunionstore new_set presidents kings beatles
(integer) 8
与sinterstore和sdiffstore一样,如果目标键已存在,sunionstore将覆盖它。
结论
本指南详细介绍了在Redis中创建和管理集合的一些命令。如果您在本指南中还希望了解其他相关命令、参数或步骤,请在评论中提问或提出建议。
关于Redis命令的更多信息,请查看我们关于如何管理Redis数据库的教程系列。